diff --git a/.eslintrc.json b/.eslintrc.json index 55166492cc..f7dc38e494 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -10,7 +10,7 @@ "error", { "enforceBuildableLibDependency": false, - "allow": [], + "allow": ["^@abgov/web-components$", "^@abgov/style$"], "depConstraints": [ { "sourceTag": "*", diff --git a/.github/workflows/release-ci.yml b/.github/workflows/release-ci.yml index 7fd49e7c4b..50815d5013 100644 --- a/.github/workflows/release-ci.yml +++ b/.github/workflows/release-ci.yml @@ -10,10 +10,15 @@ on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: +permissions: + id-token: write # Required for OIDC + contents: read + jobs: build: runs-on: ubuntu-latest - + permissions: + contents: write steps: - uses: actions/checkout@v2 with: diff --git a/.gitignore b/.gitignore index 3a1a5d1105..f554e8d291 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,9 @@ # Custom .nx -playground -.playgrounds +apps/dev/angular +apps/dev/react +apps/dev/web NOTES.md /test-results __screenshots__ @@ -67,4 +68,4 @@ devenv.local.nix vite.config.*.timestamp* vitest.config.*.timestamp* .cursor/rules/nx-rules.mdc -.github/instructions/nx.instructions.md \ No newline at end of file +.github/instructions/nx.instructions.md diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..521a9f7c07 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/.nxignore b/.nxignore index a60609e6c6..7706a47b69 100644 --- a/.nxignore +++ b/.nxignore @@ -1,2 +1,4 @@ -!playground **/.*/ +!apps/dev/web +!apps/dev/react +!apps/dev/angular diff --git a/.templates/angular/.eslintrc.json b/.templates/angular/.eslintrc.json index 98a83993d8..96b5a50035 100644 --- a/.templates/angular/.eslintrc.json +++ b/.templates/angular/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": ["../../.eslintrc.json"], + "extends": ["../../../.eslintrc.json"], "ignorePatterns": ["!**/*"], "overrides": [ { diff --git a/.templates/angular/project.json b/.templates/angular/project.json index 4e3b1309ab..f7a039a435 100644 --- a/.templates/angular/project.json +++ b/.templates/angular/project.json @@ -1,25 +1,25 @@ { - "name": "angular", - "$schema": "../../node_modules/nx/schemas/project-schema.json", + "name": "angular-dev", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", "projectType": "application", "prefix": "abgov", - "sourceRoot": "playground/angular/src", + "sourceRoot": "apps/dev/angular/src", "tags": [], "targets": { "build": { "executor": "@angular-devkit/build-angular:application", "outputs": ["{options.outputPath}"], "options": { - "outputPath": "dist/playground/angular", - "index": "playground/angular/src/index.html", - "browser": "playground/angular/src/main.ts", + "outputPath": "dist/apps/dev/angular", + "index": "apps/dev/angular/src/index.html", + "browser": "apps/dev/angular/src/main.ts", "polyfills": ["zone.js"], - "tsConfig": "playground/angular/tsconfig.app.json", + "tsConfig": "apps/dev/angular/tsconfig.app.json", "assets": [ - "playground/angular/src/favicon.ico", - "playground/angular/src/assets" + "apps/dev/angular/src/favicon.ico", + "apps/dev/angular/src/assets" ], - "styles": ["playground/angular/src/styles.css"], + "styles": ["apps/dev/angular/src/styles.css"], "scripts": [] }, "configurations": { @@ -27,8 +27,8 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" + "maximumWarning": "2mb", + "maximumError": "3mb" }, { "type": "anyComponentStyle", @@ -50,10 +50,10 @@ "executor": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { - "buildTarget": "angular:build:production" + "buildTarget": "angular-dev:build:production" }, "development": { - "buildTarget": "angular:build:development" + "buildTarget": "angular-dev:build:development" } }, "defaultConfiguration": "development" @@ -61,7 +61,7 @@ "extract-i18n": { "executor": "@angular-devkit/build-angular:extract-i18n", "options": { - "buildTarget": "angular:build" + "buildTarget": "angular-dev:build" } }, "lint": { diff --git a/.templates/angular/src/app/app-routing.module.ts b/.templates/angular/src/app/app-routing.module.ts index 75dcd69f94..4819a90925 100644 --- a/.templates/angular/src/app/app-routing.module.ts +++ b/.templates/angular/src/app/app-routing.module.ts @@ -1,13 +1,11 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; -import { ComponentWrapperPageComponent } from "./component-wrapper"; +import { PlaygroundComponent } from "./playground"; -const routes: Routes = [ - { path: "/", component: ComponentWrapperPageComponent }, -]; +const routes: Routes = [{ path: "", component: PlaygroundComponent }]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule], }) -export class AppRoutingModule { } +export class AppRoutingModule {} diff --git a/.templates/angular/src/app/app.component.ts b/.templates/angular/src/app/app.component.ts index 570983ee54..4195567bae 100644 --- a/.templates/angular/src/app/app.component.ts +++ b/.templates/angular/src/app/app.component.ts @@ -1,8 +1,11 @@ -import {Component, OnInit} from "@angular/core"; +import { Component, OnInit } from "@angular/core"; +import { RouterOutlet } from "@angular/router"; @Component({ - selector: "goab-root", - template: "" + selector: "abgov-root", + template: "", + standalone: true, + imports: [RouterOutlet], }) export class AppComponent implements OnInit { ngOnInit() { diff --git a/.templates/angular/src/app/app.module.ts b/.templates/angular/src/app/app.module.ts index c831cabce3..188e309b77 100644 --- a/.templates/angular/src/app/app.module.ts +++ b/.templates/angular/src/app/app.module.ts @@ -6,17 +6,18 @@ import { AngularComponentsModule } from "@abgov/angular-components"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { NgForOf, NgIf } from "@angular/common"; -import { ComponentWrapperPageComponent } from "./component-wrapper"; +import { PlaygroundComponent } from "./playground"; +import { AppRoutingModule } from "./app-routing.module"; import "@abgov/web-components"; @NgModule({ - declarations: [ - AppComponent, - ], + declarations: [], imports: [ + AppComponent, AngularComponentsModule, - ComponentWrapperPageComponent, + PlaygroundComponent, BrowserModule, + AppRoutingModule, FormsModule, NgForOf, NgIf, @@ -27,4 +28,4 @@ import "@abgov/web-components"; bootstrap: [AppComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], }) -export class AppModule { } +export class AppModule {} diff --git a/.templates/angular/src/app/component-wrapper.ts b/.templates/angular/src/app/component-wrapper.ts deleted file mode 100644 index 7f22d9e904..0000000000 --- a/.templates/angular/src/app/component-wrapper.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { CUSTOM_ELEMENTS_SCHEMA, Component } from "@angular/core"; -import { CommonModule } from "@angular/common"; -import { - GoabAccordion, - GoabAppFooter, - GoabAppFooterMetaSection, - GoabAppFooterNavSection, - GoabAppHeader, - GoabAppHeaderMenu, - GoabBadge, - GoabBlock, - GoabButton, - GoabButtonGroup, - GoabCallout, - GoabCheckbox, - GoabChip, - GoabCircularProgress, - GoabContainer, - GoabDatePicker, - GoabDetails, - GoabDivider, - GoabDropdown, - GoabDropdownItem, - GoabFileUploadCard, - GoabFileUploadInput, - GoabFormItem, - GoabFormStep, - GoabFormStepper, - GoabHeroBanner, - GoabIcon, - GoabIconButton, - GoabInput, - GoabModal, - GoabNotification, - GoabPages, - GoabPagination, - GoabPopover, - GoabRadioGroup, - GoabRadioItem, - GoabSideMenu, - GoabSideMenuGroup, - GoabSideMenuHeading, - GoabSkeleton, - GoabTab, - GoabTable, - GoabTabs, - GoabTooltip, - GoabSpacer, - GoabTextArea, -} from "@abgov/angular-components"; - -@Component({ - standalone: true, - selector: "abgov-component-wrapper", - template: ` -
- -
- `, - - schemas: [CUSTOM_ELEMENTS_SCHEMA], - imports: [ - CommonModule, - GoabBadge, - GoabButton, - GoabDropdown, - GoabDropdownItem, - GoabDatePicker, - GoabModal, - GoabAccordion, - GoabAppFooter, - GoabAppFooterMetaSection, - GoabAppFooterNavSection, - GoabAppHeader, - GoabAppHeaderMenu, - GoabButtonGroup, - GoabCallout, - GoabCheckbox, - GoabChip, - GoabContainer, - GoabDetails, - GoabDivider, - GoabFileUploadCard, - GoabFileUploadInput, - GoabFormItem, - GoabFormStep, - GoabFormStepper, - GoabPages, - GoabHeroBanner, - GoabIcon, - GoabIconButton, - GoabInput, - GoabNotification, - GoabPagination, - GoabPopover, - GoabCircularProgress, - GoabRadioGroup, - GoabRadioItem, - GoabSideMenu, - GoabSideMenuGroup, - GoabSideMenuHeading, - GoabSkeleton, - GoabTable, - GoabTabs, - GoabTab, - GoabTextArea, - GoabTooltip, - GoabBlock, - GoabSpacer, - ], -}) -export class ComponentWrapperPageComponent {} diff --git a/.templates/angular/src/app/playground.ts b/.templates/angular/src/app/playground.ts new file mode 100644 index 0000000000..cab524670c --- /dev/null +++ b/.templates/angular/src/app/playground.ts @@ -0,0 +1,24 @@ +import { CUSTOM_ELEMENTS_SCHEMA, Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabInput, + /* Import components here */ +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-app", + template: ` +
+ +
+ `, + + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + CommonModule, + GoabInput, + // add test components here + ], +}) +export class PlaygroundComponent {} diff --git a/.templates/angular/src/index.html b/.templates/angular/src/index.html index d34968612b..1b9821ebb2 100644 --- a/.templates/angular/src/index.html +++ b/.templates/angular/src/index.html @@ -12,7 +12,7 @@ - + diff --git a/.templates/angular/src/styles.css b/.templates/angular/src/styles.css index 20b8e4485b..963ef40b19 100644 --- a/.templates/angular/src/styles.css +++ b/.templates/angular/src/styles.css @@ -1,5 +1,5 @@ /* You can add global styles to this file, and also import other style files */ -@import "../../../dist/libs/web-components/index.css"; +@import "../../../../dist/libs/web-components/index.css"; :root { --goa-space-fill: 32ch; diff --git a/.templates/angular/tsconfig.app.json b/.templates/angular/tsconfig.app.json index fff4a41d44..58220429a4 100644 --- a/.templates/angular/tsconfig.app.json +++ b/.templates/angular/tsconfig.app.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "../../dist/out-tsc", + "outDir": "../../../dist/out-tsc", "types": [] }, "files": ["src/main.ts"], diff --git a/.templates/angular/tsconfig.json b/.templates/angular/tsconfig.json index cd3727d6fb..b94f8837df 100644 --- a/.templates/angular/tsconfig.json +++ b/.templates/angular/tsconfig.json @@ -20,7 +20,7 @@ "path": "./tsconfig.editor.json" } ], - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true, diff --git a/.templates/react/.eslintrc.json b/.templates/react/.eslintrc.json index a39ac5d057..75b85077de 100644 --- a/.templates/react/.eslintrc.json +++ b/.templates/react/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": ["plugin:@nx/react", "../../.eslintrc.json"], + "extends": ["plugin:@nx/react", "../../../.eslintrc.json"], "ignorePatterns": ["!**/*"], "overrides": [ { diff --git a/.templates/react/project.json b/.templates/react/project.json index 2a15c2f164..acef9c1824 100644 --- a/.templates/react/project.json +++ b/.templates/react/project.json @@ -1,7 +1,7 @@ { - "name": "react", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "playground/react/src", + "name": "react-dev", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/dev/react/src", "projectType": "application", "targets": { "build": { @@ -9,7 +9,7 @@ "outputs": ["{options.outputPath}"], "defaultConfiguration": "production", "options": { - "outputPath": "dist/playground/react" + "outputPath": "dist/apps/dev/react" }, "configurations": { "development": { @@ -24,15 +24,15 @@ "executor": "@nx/vite:dev-server", "defaultConfiguration": "development", "options": { - "buildTarget": "react:build" + "buildTarget": "react-dev:build" }, "configurations": { "development": { - "buildTarget": "react:build:development", + "buildTarget": "react-dev:build:development", "hmr": true }, "production": { - "buildTarget": "react:build:production", + "buildTarget": "react-dev:build:production", "hmr": false } } @@ -41,14 +41,14 @@ "executor": "@nx/vite:preview-server", "defaultConfiguration": "development", "options": { - "buildTarget": "react:build" + "buildTarget": "react-dev:build" }, "configurations": { "development": { - "buildTarget": "react:build:development" + "buildTarget": "react-dev:build:development" }, "production": { - "buildTarget": "react:build:production" + "buildTarget": "react-dev:build:production" } } }, diff --git a/.templates/react/src/app/Playground.tsx b/.templates/react/src/app/Playground.tsx new file mode 100644 index 0000000000..2fcf6f266b --- /dev/null +++ b/.templates/react/src/app/Playground.tsx @@ -0,0 +1,8 @@ +export default function Playground() { + + return ( +
+ The playground +
+ ); +} diff --git a/.templates/react/src/app/TestContent.tsx b/.templates/react/src/app/TestContent.tsx deleted file mode 100644 index ec7c011b4f..0000000000 --- a/.templates/react/src/app/TestContent.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export function TestContent() { - - return ( -
- -
- ); -} diff --git a/.templates/react/src/app/app.tsx b/.templates/react/src/app/app.tsx index 283a56cd71..a84b5d650e 100644 --- a/.templates/react/src/app/app.tsx +++ b/.templates/react/src/app/app.tsx @@ -1,6 +1,4 @@ -import { Link, Outlet } from "react-router-dom"; - -import { TestContent } from "./TestContent"; +import { Outlet } from "react-router-dom"; import { GoabAppFooter, @@ -18,7 +16,7 @@ export function App() { View All - Test + Playground
diff --git a/.templates/react/src/main.tsx b/.templates/react/src/main.tsx index c8ffcb27e4..e0c3886a8c 100644 --- a/.templates/react/src/main.tsx +++ b/.templates/react/src/main.tsx @@ -5,7 +5,7 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; import "@abgov/web-components"; import App from "./app/app"; import AllComponents from "./app/all"; -import { TestContent } from "./app/TestContent"; +import Playground from "./app/Playground"; const root = ReactDOM.createRoot( document.getElementById("root") as HTMLElement, @@ -18,7 +18,7 @@ root.render( }> } /> - } /> + } /> diff --git a/.templates/react/tsconfig.app.json b/.templates/react/tsconfig.app.json index cd44a1e78f..2a5ff5ebd5 100644 --- a/.templates/react/tsconfig.app.json +++ b/.templates/react/tsconfig.app.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "../../dist/out-tsc", + "outDir": "../../../dist/out-tsc", "types": [ "node", "@nx/react/typings/cssmodule.d.ts", diff --git a/.templates/react/tsconfig.json b/.templates/react/tsconfig.json index fe609d7af3..4467b39320 100644 --- a/.templates/react/tsconfig.json +++ b/.templates/react/tsconfig.json @@ -14,5 +14,5 @@ "path": "./tsconfig.app.json" } ], - "extends": "../../tsconfig.base.json" + "extends": "../../../tsconfig.base.json" } diff --git a/.templates/react/vite.config.ts b/.templates/react/vite.config.ts index d7c536102c..f77894c6f3 100644 --- a/.templates/react/vite.config.ts +++ b/.templates/react/vite.config.ts @@ -5,16 +5,20 @@ import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin"; export default defineConfig({ root: __dirname, - cacheDir: "../../node_modules/.vite/playground/react", + cacheDir: "../../../node_modules/.vite/playground/react", server: { - port: 4200, + port: 4201, host: "0.0.0.0", + // Enable SPA fallback for client-side routing + historyApiFallback: true, }, preview: { port: 4300, host: "localhost", + // Enable SPA fallback in preview mode too + historyApiFallback: true, }, plugins: [react(), nxViteTsPaths()], @@ -25,7 +29,7 @@ export default defineConfig({ // }, build: { - outDir: "../../dist/playground/react", + outDir: "../../../dist/apps/prs/react", reportCompressedSize: true, minify: false, commonjsOptions: { diff --git a/.templates/web/.eslintrc.json b/.templates/web/.eslintrc.json index 9d9c0db55b..3456be9b90 100644 --- a/.templates/web/.eslintrc.json +++ b/.templates/web/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": ["../../.eslintrc.json"], + "extends": ["../../../.eslintrc.json"], "ignorePatterns": ["!**/*"], "overrides": [ { diff --git a/.templates/web/project.json b/.templates/web/project.json index 33855a6641..c870a0f113 100644 --- a/.templates/web/project.json +++ b/.templates/web/project.json @@ -1,8 +1,8 @@ { - "name": "web", - "$schema": "../../node_modules/nx/schemas/project-schema.json", + "name": "web-dev", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", "projectType": "application", - "sourceRoot": "playground/web/src", + "sourceRoot": "apps/dev/web/src", "tags": [], "implicitDependencies": [ "web-components" @@ -15,7 +15,7 @@ ], "defaultConfiguration": "production", "options": { - "outputPath": "dist/playground/web" + "outputPath": "dist/apps/dev/web" }, "configurations": { "development": { @@ -30,15 +30,15 @@ "executor": "@nx/vite:dev-server", "defaultConfiguration": "development", "options": { - "buildTarget": "web:build" + "buildTarget": "web-dev:build" }, "configurations": { "development": { - "buildTarget": "web:build:development", + "buildTarget": "web-dev:build:development", "hmr": true }, "production": { - "buildTarget": "web:build:production", + "buildTarget": "web-dev:build:production", "hmr": false } } @@ -47,14 +47,14 @@ "executor": "@nx/vite:preview-server", "defaultConfiguration": "development", "options": { - "buildTarget": "web:build" + "buildTarget": "web-dev:build" }, "configurations": { "development": { - "buildTarget": "web:build:development" + "buildTarget": "web-dev:build:development" }, "production": { - "buildTarget": "web:build:production" + "buildTarget": "web-dev:build:production" } } }, @@ -65,4 +65,4 @@ ] } } -} \ No newline at end of file +} diff --git a/.templates/web/src/app/App.svelte b/.templates/web/src/app/App.svelte index dd0f1ec021..ce9aef4429 100644 --- a/.templates/web/src/app/App.svelte +++ b/.templates/web/src/app/App.svelte @@ -4,5 +4,10 @@ + + + + diff --git a/.templates/web/src/app/Playground.svelte b/.templates/web/src/app/Playground.svelte new file mode 100644 index 0000000000..46962b165b --- /dev/null +++ b/.templates/web/src/app/Playground.svelte @@ -0,0 +1,6 @@ + + + +The web playground diff --git a/.templates/web/tsconfig.app.json b/.templates/web/tsconfig.app.json index 031e9c720f..5a6d3e61df 100644 --- a/.templates/web/tsconfig.app.json +++ b/.templates/web/tsconfig.app.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "../../dist/out-tsc", + "outDir": "../../../dist/out-tsc", "declaration": true, "types": ["node"] }, diff --git a/.templates/web/tsconfig.json b/.templates/web/tsconfig.json index af79c85a6c..715e5cd65f 100644 --- a/.templates/web/tsconfig.json +++ b/.templates/web/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "files": [], "compilerOptions": { "target": "ESNext", diff --git a/.templates/web/vite.config.mts b/.templates/web/vite.config.mts index 4ada67c6b1..8d35eda1ad 100644 --- a/.templates/web/vite.config.mts +++ b/.templates/web/vite.config.mts @@ -1,26 +1,27 @@ /// import { defineConfig } from "vite"; import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin"; -import { svelte } from '@sveltejs/vite-plugin-svelte'; +import { svelte } from "@sveltejs/vite-plugin-svelte"; export default defineConfig({ root: __dirname, - cacheDir: "../../node_modules/.vite/playground/web", + cacheDir: "../../node_modules/.vite/apps/prs-web", server: { - port: 4200, + port: 4202, host: "0.0.0.0", + // Enable SPA fallback for client-side routing + historyApiFallback: true, }, preview: { port: 4300, host: "localhost", + // Enable SPA fallback in preview mode too + historyApiFallback: true, }, - plugins: [ - nxViteTsPaths(), - svelte(), - ], + plugins: [nxViteTsPaths(), svelte()], // Uncomment this if you are using workers. // worker: { @@ -28,7 +29,7 @@ export default defineConfig({ // }, build: { - outDir: "../../dist/playground/web", + outDir: "../../dist/apps/prs-web", reportCompressedSize: true, commonjsOptions: { transformMixedEsModules: true, diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..a4af2fc762 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,375 @@ +# UI Components - Development Guide + +Development guidance for the GoA Design System UI Components monorepo. + +--- + +## Quick Reference + +| Library | Location | Framework | Naming | +| ---------------- | -------------------------- | ---------- | ------------------ | +| Web Components | `libs/web-components/` | Svelte | `goa-*` tags | +| React Wrappers | `libs/react-components/` | React | `Goab*` components | +| Angular Wrappers | `libs/angular-components/` | Angular | `goab-*` selectors | +| Shared Types | `libs/common/` | TypeScript | Types + utilities | + +--- + +## Architecture: The Wrapper Pattern + +Understanding this pattern is essential for working in this codebase. + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Source of Truth │ +│ │ +│ libs/web-components/src/components/button/Button.svelte │ +│ - All logic, styling, and behavior │ +│ - Compiles to custom element │ +│ - Uses Svelte's customElement directive │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ Framework Wrappers │ +│ │ +│ React: libs/react-components/src/lib/button/button.tsx │ +│ - Wraps element │ +│ - Transforms React props → web component attributes │ +│ - Handles React-specific event binding │ +│ │ +│ Angular: libs/angular-components/src/lib/components/button/ │ +│ - Wraps element │ +│ - Uses @Input/@Output decorators │ +│ - Integrates with Angular forms (ControlValueAccessor) │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**Key insight:** When fixing bugs or adding features, start with the Svelte component. The wrappers are thin layers that expose the web component to each framework. + +--- + +## Development Standards + +### Always Follow These Rules + +1. **Svelte is the source of truth** - Fix bugs in Svelte first, then update wrappers +2. **Design tokens first** - Use design tokens whenever possible; avoid hardcoding colors, spacing, or typography +3. **WCAG 2.2 AA** - Accessibility is mandatory, not optional +4. **All three frameworks** - Every component change needs React + Angular wrapper updates +5. **Tests required** - No component changes without corresponding test updates +6. **Backward compatibility** - Don't break existing implementations + +### Props Conventions + +| Framework | Casing | Boolean Example | Event Example | +| ------------- | --------------- | ------------------- | ------------------ | +| Web Component | lowercase | `disabled="true"` | `_click` event | +| React | camelCase | `disabled={true}` | `onClick` prop | +| Angular | camelCase input | `[disabled]="true"` | `(onClick)` output | + +--- + +## Common Development Workflows + +### Updating an Existing Component + +1. **Modify the Svelte component** (`libs/web-components/src/components/[name]/`) + - Update logic, props, styling in `.svelte` file + - Update tests in `.spec.ts` + +2. **Update React wrapper** (`libs/react-components/src/lib/[name]/`) + - Add/update props in interface + - Handle prop transformation if needed + - Update tests in `.spec.tsx` + +3. **Update Angular wrapper** (`libs/angular-components/src/lib/components/[name]/`) + - Add `@Input()` for new props + - Add `@Output()` for new events + - Update tests in `.spec.ts` + +4. **Update shared types** if needed (`libs/common/src/lib/common.ts`) + +5. **Run tests:** + + ```bash + npm run build # Build all libraries + npm run test:pr # Full PR validation + ``` + +6. **Test in playgrounds:** + ```bash + npm run serve:prs:react + npm run serve:prs:angular + npm run serve:prs:web + ``` + +### Adding a New Component + +Follow the same structure as existing components. Each component needs: + +**Web Component (Svelte):** + +``` +libs/web-components/src/components/[name]/ +├── ComponentName.svelte # Main implementation +├── ComponentName.spec.ts # Unit tests +├── ComponentName.html-data.json # VS Code IntelliSense (optional) +└── doc.md # Documentation (optional) +``` + +**React Wrapper:** + +``` +libs/react-components/src/lib/[name]/ +├── component-name.tsx # Wrapper component +└── component-name.spec.tsx # Tests +``` + +**Angular Wrapper:** + +``` +libs/angular-components/src/lib/components/[name]/ +├── component-name.ts # Wrapper component +└── component-name.spec.ts # Tests +``` + +Don't forget to export from each library's `index.ts`. + +--- + +## Testing + +### Test Commands + +```bash +# Watch modes (during development) +npm run test:unit:watch # Unit tests only +npm run test:browser:watch # Browser tests (Playwright) +npm run test:headless:watch # Headless browser tests + +# Full validation (before PR) +npm run test:pr # Build + unit + headless + +# Framework-specific +npm run test:angular # Angular tests via Jest +``` + +### Test Framework by Library + +| Library | Framework | Location | +| --------------- | -------------------------------- | -------------------------------- | +| Web Components | Vitest + @testing-library/svelte | `*.spec.ts` alongside component | +| React | Vitest + @testing-library/react | `*.spec.tsx` alongside component | +| React (browser) | Vitest + Playwright | `*.browser.spec.tsx` | +| Angular | Jest | `*.spec.ts` alongside component | + +--- + +## PR Testing Playground + +The `apps/prs/` folder contains shared playgrounds for testing bugs and features. **When you submit a PR, you also submit your playground test page** so the team can test your changes and build on your test cases. + +### Why This Matters + +- Test pages are committed with your PR - they're shared artifacts, not throwaway code +- Reviewers use your test page to verify the fix/feature works +- Team members can add additional test cases if they find gaps +- The side menu item makes your test discoverable to everyone + +### Structure + +``` +apps/prs/ +├── react/ # React playground (primary) +├── angular/ # Angular playground +└── web/ # Web components playground +``` + +Test pages live in: + +- `apps/prs/react/src/routes/bugs/` - for bug fixes +- `apps/prs/react/src/routes/features/` - for new features + +### Creating a Test Page + +1. **Copy the template:** + + ```bash + # For bugs (use the GitHub issue number) + cp apps/prs/react/src/routes/_TEMPLATE.tsx apps/prs/react/src/routes/bugs/bug{N}.tsx + + # For features + cp apps/prs/react/src/routes/_TEMPLATE.tsx apps/prs/react/src/routes/features/feat{N}.tsx + ``` + +2. **Update the file:** + - Rename component to `Bug{N}Route` or `Feat{N}Route` + - Update issue number, title, and paste the issue description from GitHub + - Add test cases that demonstrate the fix/feature + +3. **Wire it up:** + - Add import to `main.tsx` + - Add `` to `main.tsx` (keep numerical order) + - **Add `` to `app.tsx` side menu** with format: `{issue number} {short name}` + - Example: `2878 DatePicker onChange` or `1547 Tooltip positioning` + +4. **Run the playground:** + ```bash + npm run serve:prs:react + ``` + +### Test Page Checklist + +- [ ] Route file in correct folder (`bugs/` or `features/`) +- [ ] Component renamed from `TemplateRoute` +- [ ] Issue details updated (number, title, description from GitHub) +- [ ] Test cases with clear descriptions +- [ ] Import added to `main.tsx` +- [ ] Route added to `main.tsx` (numerical order) +- [ ] **Link added to `app.tsx` side menu** with issue number + short name +- [ ] Page loads and navigation works + +See `apps/prs/react/src/routes/README.md` for detailed instructions. + +--- + +## Naming Conventions + +### Components + +| Context | Convention | Example | +| ----------------- | --------------- | --------------- | +| Web Component tag | `goa-{name}` | `` | +| React component | `Goab{Name}` | `GoabButton` | +| Angular selector | `goab-{name}` | `` | +| File (React) | `{name}.tsx` | `button.tsx` | +| File (Angular) | `{name}.ts` | `button.ts` | +| File (Svelte) | `{Name}.svelte` | `Button.svelte` | + +### Props/Attributes + +| Type | Web Component | React | Angular | +| ---------- | ---------------- | ------------- | ------------- | +| Regular | `leadingicon` | `leadingIcon` | `leadingIcon` | +| Multi-word | `action-args` | `actionArgs` | `actionArgs` | +| Boolean | `"true"/"false"` | `true/false` | `true/false` | + +### Spacing Values + +Used for `mt`, `mr`, `mb`, `ml` props: + +``` +Numeric: "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" +T-shirt: "none", "3xs", "2xs", "xs", "s", "m", "l", "xl", "2xl", "3xl", "4xl" +``` + +--- + +## Design Tokens + +All styling uses CSS custom properties from `@abgov/design-tokens`. + +**Location:** `libs/web-components/src/assets/css/` + +- `variables.css` - Custom property definitions +- `components.css` - Component-specific styles +- `fonts.css` - Typography +- `reset.css` - CSS reset + +**Usage in Svelte:** + +```svelte + +``` + +**Design tokens first.** If a token doesn't exist for what you need, discuss with the team about adding one. + +--- + +## Folder Structure Reference + +``` +libs/ +├── web-components/ +│ ├── src/ +│ │ ├── components/ # Svelte components +│ │ │ └── button/ +│ │ │ ├── Button.svelte +│ │ │ └── Button.spec.ts +│ │ ├── assets/css/ # Design tokens CSS +│ │ ├── common/ # Shared utilities +│ │ └── index.ts # Exports +│ ├── package.json +│ └── vite.config.js +│ +├── react-components/ +│ ├── src/ +│ │ ├── lib/ # React wrappers +│ │ │ └── button/ +│ │ │ ├── button.tsx +│ │ │ └── button.spec.tsx +│ │ └── index.ts +│ └── package.json +│ +├── angular-components/ +│ ├── src/ +│ │ └── lib/ +│ │ └── components/ # Angular wrappers +│ │ └── button/ +│ │ ├── button.ts +│ │ └── button.spec.ts +│ └── ng-package.json +│ +└── common/ + └── src/ + └── lib/ + └── common.ts # Shared types (GoabButtonType, etc.) + +apps/ +└── prs/ # PR testing playgrounds + ├── react/ + ├── angular/ + └── web/ + +playground/ # Development playgrounds +├── react/ +├── angular/ +└── web/ +``` + +--- + +## Common Issues & Solutions + +### "Boolean prop not working" + +Web components receive all attributes as strings: + +```tsx +// React: Convert boolean to string +disabled={disabled ? "true" : undefined} +``` + +### "Event not firing" + +- Web component events use underscore prefix: `_click`, `_change` +- React/Angular wrappers expose as `onClick`, `onChange` +- Check the web component is dispatching with `dispatch()` utility + +### "Styles not applying" + +1. Check you're using CSS custom properties, not hardcoded values +2. Verify the component imports the correct CSS files +3. Check if the style is scoped correctly in Svelte + +### "Tests failing after component update" + +1. Run `npm run build` first - wrappers may need rebuilt +2. Check all three frameworks have updated tests +3. Verify types in `libs/common/` match the new props diff --git a/README.md b/README.md index 8590658a50..e5d744a892 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,12 @@ is designed to be used to help bring consistency to all Government of Alberta websites and web applications. It's also being designed to help ease the burden on designers and developers alike throughout the development process. -## Development environment - -Create .env file from .env.example - -```bash -if [ ! -f .env ]; then cp ./.env.example ./.env; fi -``` - ### Playground setup -Run the `pg-setup` file. +Run the `dev-setup` file. ```bash -npm run pg:setup +npm run dev:setup ``` You can then test the playground apps at `localhost:4200` by running: @@ -29,28 +21,9 @@ You can then test the playground apps at `localhost:4200` by running: npm run dev:watch # add one of the following -npm run serve:angular -npm run serve:react -npm run serve:web -``` - -### Multiple playgrounds - -Since the playground is not included in the CVS it is common to have playground -comment/uncomment code the `npm run pg:switch` script can automate this by switching -code that is out of sync with library code. To prevent having to continually -between playgrounds that are specific to the branch. - -To switch to a branch that doesn't yet exist, run the following - -```bash -npm run pg:switch new [branch-name] -``` - -To switch to an existing branch run the following - -```bash -npm run pg:switch [branch-name] +npm run serve:dev:angular +npm run serve:dev:react +npm run serve:dev:web ``` --- diff --git a/apps/prs/angular/.eslintrc.json b/apps/prs/angular/.eslintrc.json new file mode 100644 index 0000000000..96b5a50035 --- /dev/null +++ b/apps/prs/angular/.eslintrc.json @@ -0,0 +1,36 @@ +{ + "extends": ["../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": [ + "plugin:@nx/angular", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "abgov", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "abgov", + "style": "kebab-case" + } + ] + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nx/angular-template"], + "rules": {} + } + ] +} diff --git a/apps/prs/angular/.gitignore b/apps/prs/angular/.gitignore new file mode 100644 index 0000000000..4d058db7df --- /dev/null +++ b/apps/prs/angular/.gitignore @@ -0,0 +1,9 @@ +# Devenv +.devenv* +devenv.local.nix + +# direnv +.direnv + +# pre-commit +.pre-commit-config.yaml diff --git a/apps/prs/angular/angular.json b/apps/prs/angular/angular.json new file mode 100644 index 0000000000..a264238b5d --- /dev/null +++ b/apps/prs/angular/angular.json @@ -0,0 +1,64 @@ +{ + "$schema": "../../../node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "angular-prs": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "abgov", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "outputPath": "dist/apps/prs/angular", + "index": "src/index.html", + "browser": "src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "tsconfig.app.json", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.css"], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "3mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "angular-prs:build:production" + }, + "development": { + "buildTarget": "angular-prs:build:development" + } + }, + "defaultConfiguration": "development" + } + } + } + } +} diff --git a/apps/prs/angular/project.json b/apps/prs/angular/project.json new file mode 100644 index 0000000000..4ace99a7fc --- /dev/null +++ b/apps/prs/angular/project.json @@ -0,0 +1,72 @@ +{ + "name": "angular-prs", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "abgov", + "sourceRoot": "apps/prs/angular/src", + "tags": [], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/prs/angular", + "index": "apps/prs/angular/src/index.html", + "browser": "apps/prs/angular/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/prs/angular/tsconfig.app.json", + "assets": [ + "apps/prs/angular/src/favicon.ico", + "apps/prs/angular/src/assets" + ], + "styles": ["apps/prs/angular/src/styles.css"], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "3mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "angular-prs:build:production" + }, + "development": { + "buildTarget": "angular-prs:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "angular-prs:build" + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"] + } + } +} diff --git a/apps/prs/angular/src/app/abgov-app.ts b/apps/prs/angular/src/app/abgov-app.ts new file mode 100644 index 0000000000..3ab16c2e39 --- /dev/null +++ b/apps/prs/angular/src/app/abgov-app.ts @@ -0,0 +1,17 @@ +import { CUSTOM_ELEMENTS_SCHEMA, Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import {} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-app", + template: ` +
+ +
+ `, + + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [CommonModule], +}) +export class AbgovAppComponent {} diff --git a/apps/prs/angular/src/app/app.component.html b/apps/prs/angular/src/app/app.component.html new file mode 100644 index 0000000000..23c184a0d1 --- /dev/null +++ b/apps/prs/angular/src/app/app.component.html @@ -0,0 +1,87 @@ +
+
+ + + Home + + 2878 + Regional Insights + Occupational Insights + + +
+ +
+
+ + All Components + + 2152 + 2331 + 2393 + 2404 + 2408 + 2459 + 2473 + 2502 + 2529 + 2547 + 2655 + 2720 + 2721 + 2750 + 2768 + 2782 + 2789 + 2821 + 2837 + 2839 + 2849 + 2852 + 2873 + 2878 + 2892 + 2922 + 2943 + 2948 + 2977 + 2991 + 3072 + 3118 + 3156 + 3201 + 3215 + 3248 + + + 1328 + 1383 + 1547 + 1813 + 1908 + 2054 + 2267 + 2328 + 2361 + 2440 + 2492 + 2611 + 2611-tabs-disabled + 2682 + 2722 + 2730 + 2829 + 3102 + 1908 + 2609 + + +
+
+ +
+
+
+ +
+
diff --git a/apps/prs/angular/src/app/app.component.ts b/apps/prs/angular/src/app/app.component.ts new file mode 100644 index 0000000000..4f9c653c7d --- /dev/null +++ b/apps/prs/angular/src/app/app.component.ts @@ -0,0 +1,9 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "abgov-root", + templateUrl: "./app.component.html", + styles: ``, + standalone: false, +}) +export class AppComponent {} diff --git a/apps/prs/angular/src/app/app.module.ts b/apps/prs/angular/src/app/app.module.ts new file mode 100644 index 0000000000..bfa44a8458 --- /dev/null +++ b/apps/prs/angular/src/app/app.module.ts @@ -0,0 +1,40 @@ +import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { FormsModule } from "@angular/forms"; +import { RouterModule } from "@angular/router"; +import { ReactiveFormsModule } from "@angular/forms"; +import { AppComponent } from "./app.component"; +import { appRoutes } from "./app.routes"; +import { AngularComponentsModule } from "@abgov/angular-components"; + +import "@abgov/web-components"; + +import { + GoabAppHeader, + GoabAppFooter, + GoabMicrositeHeader, + GoabAppHeaderMenu, + GoabSideMenu, + GoabSideMenuGroup, +} from "@abgov/angular-components"; + +@NgModule({ + declarations: [AppComponent], + imports: [ + GoabAppHeader, + GoabAppFooter, + GoabMicrositeHeader, + GoabAppHeaderMenu, + GoabSideMenu, + GoabSideMenuGroup, + BrowserModule, + RouterModule.forRoot(appRoutes), + AngularComponentsModule, + FormsModule, + ReactiveFormsModule, + ], + providers: [], + bootstrap: [AppComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class AppModule {} diff --git a/apps/prs/angular/src/app/app.routes.ts b/apps/prs/angular/src/app/app.routes.ts new file mode 100644 index 0000000000..4c79cc298b --- /dev/null +++ b/apps/prs/angular/src/app/app.routes.ts @@ -0,0 +1,120 @@ +import { Route } from "@angular/router"; + +import { EverythingComponent } from "./everything.component"; +import { Bug2152Component } from "../routes/bugs/2152/bug2152.component"; +import { Bug2331Component } from "../routes/bugs/2331/bug2331.component"; +import { Bug2393Component } from "../routes/bugs/2393/bug2393.component"; +import { Bug2404Component } from "../routes/bugs/2404/bug2404.component"; +import { Bug2408Component } from "../routes/bugs/2408/bug2408.component"; +import { Bug2459Component } from "../routes/bugs/2459/bug2459.component"; +import { Bug2473Component } from "../routes/bugs/2473/bug2473.component"; +import { Bug2502Component } from "../routes/bugs/2502/bug2502.component"; +import { Bug2529Component } from "../routes/bugs/2529/bug2529.component"; +import { Bug2547Component } from "../routes/bugs/2547/bug2547.component"; +import { Bug2655Component } from "../routes/bugs/2655/bug2655.component"; +import { Bug2720Component } from "../routes/bugs/2720/bug2720.component"; +import { Bug2721Component } from "../routes/bugs/2721/bug2721.component"; +import { Bug2750Component } from "../routes/bugs/2750/bug2750.component"; +import { Bug2768Component } from "../routes/bugs/2768/bug2768.component"; +import { Bug2782Component } from "../routes/bugs/2782/bug2782.component"; +import { Bug2789Component } from "../routes/bugs/2789/bug2789.component"; +import { Bug2821Component } from "../routes/bugs/2821/bug2821.component"; +import { Bug2837Component } from "../routes/bugs/2837/bug2837.component"; +import { Bug2839Component } from "../routes/bugs/2839/bug2839.component"; +import { Bug2849Component } from "../routes/bugs/2849/bug2849.component"; +import { Bug2852Component } from "../routes/bugs/2852/bug2852.component"; +import { Bug2873Component } from "../routes/bugs/2873/bug2873.component"; +import { Bug2878Component } from "../routes/bugs/2878/bug2878.component"; +import { Bug2892Component } from "../routes/bugs/2892/bug2892.component"; +import { Bug2922Component } from "../routes/bugs/2922/bug2922.component"; +import { Bug2943Component } from "../routes/bugs/2943/bug2943.component"; +import { Bug2948Component } from "../routes/bugs/2948/bug2948.component"; +import { Bug2977Component } from "../routes/bugs/2977/bug2977.component"; +import { Bug2991Component } from "../routes/bugs/2991/bug2991.component"; +import { Bug3072Component } from "../routes/bugs/3072/bug3072.component"; +import { Bug3118Component } from "../routes/bugs/3118/bug3118.component"; +import { Bug3156Component } from "../routes/bugs/3156/bug3156.component"; +import { Bug3201Component } from "../routes/bugs/3201/bug3201.component"; +import { Bug3215Component } from "../routes/bugs/3215/bug3215.component"; +import { Bug3248Component } from "../routes/bugs/3248/bug3248.component"; + +import { Feat1328Component } from "../routes/features/feat1328/feat1328.component"; +import { Feat1383Component } from "../routes/features/feat1383/feat1383.component"; +import { Feat1547Component } from "../routes/features/feat1547/feat1547.component"; +import { Feat1813Component } from "../routes/features/feat1813/feat1813.component"; +import { Feat2054Component } from "../routes/features/feat2054/feat2054.component"; +import { Feat2267Component } from "../routes/features/feat2267/feat2267.component"; +import { Feat2328Component } from "../routes/features/feat2328/feat2328.component"; +import { Feat2361Component } from "../routes/features/feat2361/feat2361.component"; +import { Feat2440Component } from "../routes/features/feat2440/feat2440.component"; +import { Feat2492Component } from "../routes/features/feat2492/feat2492.component"; +import { Feat2611Component } from "../routes/features/feat2611/feat2611.component"; +import { Feat2611TabsDisabledComponent } from "../routes/features/feat2611-tabs-disabled/feat2611-tabs-disabled.component"; +import { Feat2682Component } from "../routes/features/feat2682/feat2682.component"; +import { Feat2722Component } from "../routes/features/feat2722/feat2722.component"; +import { Feat2730Component } from "../routes/features/feat2730/feat2730.component"; +import { Feat2829Component } from "../routes/features/feat2829/feat2829.component"; +import { Feat3102Component } from "../routes/features/feat3102/feat3102.component"; +import { Feat1908Component } from "../routes/features/feat1908/feat1908.component"; +import { Feat2609Component } from "../routes/features/feat2609/feat2609.component"; + +export const appRoutes: Route[] = [ + { path: "everything", component: EverythingComponent }, + + { path: "bugs/2152", component: Bug2152Component }, + { path: "bugs/2331", component: Bug2331Component }, + { path: "bugs/2393", component: Bug2393Component }, + { path: "bugs/2404", component: Bug2404Component }, + { path: "bugs/2408", component: Bug2408Component }, + { path: "bugs/2459", component: Bug2459Component }, + { path: "bugs/2473", component: Bug2473Component }, + { path: "bugs/2502", component: Bug2502Component }, + { path: "bugs/2529", component: Bug2529Component }, + { path: "bugs/2547", component: Bug2547Component }, + { path: "bugs/2655", component: Bug2655Component }, + { path: "bugs/2720", component: Bug2720Component }, + { path: "bugs/2721", component: Bug2721Component }, + { path: "bugs/2750", component: Bug2750Component }, + { path: "bugs/2768", component: Bug2768Component }, + { path: "bugs/2782", component: Bug2782Component }, + { path: "bugs/2789", component: Bug2789Component }, + { path: "bugs/2821", component: Bug2821Component }, + { path: "bugs/2837", component: Bug2837Component }, + { path: "bugs/2839", component: Bug2839Component }, + { path: "bugs/2849", component: Bug2849Component }, + { path: "bugs/2852", component: Bug2852Component }, + { path: "bugs/2873", component: Bug2873Component }, + { path: "bugs/2878", component: Bug2878Component }, + { path: "bugs/2892", component: Bug2892Component }, + { path: "bugs/2922", component: Bug2922Component }, + { path: "bugs/2943", component: Bug2943Component }, + { path: "bugs/2948", component: Bug2948Component }, + { path: "bugs/2977", component: Bug2977Component }, + { path: "bugs/2991", component: Bug2991Component }, + { path: "bugs/3072", component: Bug3072Component }, + { path: "bugs/3118", component: Bug3118Component }, + { path: "bugs/3156", component: Bug3156Component }, + { path: "bugs/3201", component: Bug3201Component }, + { path: "bugs/3215", component: Bug3215Component }, + { path: "bugs/3248", component: Bug3248Component }, + + { path: "features/1328", component: Feat1328Component }, + { path: "features/1383", component: Feat1383Component }, + { path: "features/1547", component: Feat1547Component }, + { path: "features/1813", component: Feat1813Component }, + { path: "features/1908", component: Feat1908Component }, + { path: "features/2054", component: Feat2054Component }, + { path: "features/2267", component: Feat2267Component }, + { path: "features/2328", component: Feat2328Component }, + { path: "features/2361", component: Feat2361Component }, + { path: "features/2440", component: Feat2440Component }, + { path: "features/2492", component: Feat2492Component }, + { path: "features/2611", component: Feat2611Component }, + { path: "features/2611-tabs-disabled", component: Feat2611TabsDisabledComponent }, + { path: "features/2682", component: Feat2682Component }, + { path: "features/2722", component: Feat2722Component }, + { path: "features/2730", component: Feat2730Component }, + { path: "features/2829", component: Feat2829Component }, + { path: "features/3102", component: Feat3102Component }, + { path: "features/2609", component: Feat2609Component }, +]; diff --git a/apps/prs/angular/src/app/everything.component.css b/apps/prs/angular/src/app/everything.component.css new file mode 100644 index 0000000000..fb3b94568e --- /dev/null +++ b/apps/prs/angular/src/app/everything.component.css @@ -0,0 +1,6 @@ +pre { + background: #f5f5f5; + border-radius: 4px; + padding: 8px; + overflow: auto; +} diff --git a/apps/prs/angular/src/app/everything.component.html b/apps/prs/angular/src/app/everything.component.html new file mode 100644 index 0000000000..7b65e84202 --- /dev/null +++ b/apps/prs/angular/src/app/everything.component.html @@ -0,0 +1,1132 @@ + + Feature 2802 – Angular Component Showcase + + This page renders every Angular wrapper component with representative variations and + hooks each event into the consolidated log for regression testing against Angular 20. + + + + Recent events + + Interact with the components to populate the log. + + + + {{ entry.timestamp }} + ??" {{ entry.name }} + +
+              {{ entry.detail | json }}
+            
+
+
+
+
+
+ + + + + Text sizes + + + {{ size }} + + + + + Text colors + + + {{ colour | titlecase }} text + + + + + Block variations + + + + + + + + + + + + + + Containers + + + + Type: {{ type }}
+ Accent: {{ containerAccents[idx % containerAccents.length] || "none" }} +
+
+
+
+ + Grid & Column layout + + + + Responsive grid cards + + The `goab-grid` wrapper uses `minChildWidth="180px"` to automatically wrap + items. + + + + + Column layout automatically constrains the inner content to a readable + column width. + + + + Use padding tokens to illustrate spacing. + + + + + + Decorative illustration + Card image & actions + + Cards support image and actions slots via dedicated wrapper components. + + + + + Preview + + + Approve + + + + + Spacers & Pages + + + Spacer samples + + Left + + Right + + + Vertical spacer: + + + + + + Pages control + + Overview + Details + History + + + + +
+
+ + + + Buttons by type + + + {{ type | titlecase }} button + + + + + Variants & sizes + + + + {{ variant | titlecase }} + + + {{ size }} / {{ variant }} + + + + + + Button group & link buttons + + + Primary + Secondary + Tertiary + + + + {{ linkType | titlecase }} link (action logged) + + + + + + Icon buttons & icons + + + + + Click counts: {{ iconButtonClickCount | json }} + + + + + + + Menu button + + + + + + + + Latest menu action: + {{ menuAction }} + pending + + + + + + + + Badge palette + + + + + + Chips + + + + + + Clicks tracked: {{ chipClicks }} + + + Filter chips + + + + Filter chip clicks: {{ filterChipClicks }} + + + + + + + Inputs + + + + + Value: {{ textInputValue }} + + + + + + + + Trailing icon clicks: {{ inputTrailingClicks }} + + + + Number input & textarea + + + + + Current: {{ numberInputValue }} (trailing icon clicks: + {{ numberInputTrailingClicks }}) + + + + + + Length: {{ textareaValue.length }} chars + + + + + + Checkboxes & radio + + + + + Checked: {{ checkboxValue }} + + + + + + + + + + Selected: {{ checkboxListSelection.join(", ") || "None" }} + + + + + + + + + + Selected: {{ selectedRadio }} + + + + + + Dropdowns + + + + + + + + + Selected: {{ dropdownSelection || "None" }} + + + + + + + + Selected: {{ dropdownMultiSelection || "None" }} + + + + + + Linked dropdowns + + + + + + + Selected: {{ linkedDropdownCategory | titlecase }} + + + + + + + + Selected: + {{ linkedDropdownItem ? (linkedDropdownItem | titlecase) : "None" }} + + + + + + Date controls + + + + + + + + + + + Reactive form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reset form + + + Live values + + + GoabRadio: {{ reactiveDemoForm.get("radio")?.value || "None" }} + + + GoabCheckbox: {{ reactiveDemoForm.get("checkbox")?.value ? "true" : "false" }} + + + GoabInput: {{ reactiveDemoForm.get("input")?.value || "None" }} + + + GoabDropdown: {{ reactiveDemoForm.get("dropdown")?.value || "None" }} + + + GoabDatePicker: {{ reactiveDemoForm.get("date")?.value || "None" }} + + + GoabCheckboxList: + {{ (reactiveDemoForm.get("checkboxList")?.value || []).join(", ") || "None" }} + + + GoabTextArea: {{ reactiveDemoForm.get("textarea")?.value || "None" }} + + + + + Input width options + + + + width="75%" + + + + width="100ch" + + + + width="400px" + + + + + File upload + + + + + Files: {{ fileUploadInputFiles.join(", ") || "None" }} + + + + + + {{ fileUploadCardEvents[0] || "No actions yet" }} + + + + + + Form stepper + + + + + Active step: {{ formStepperState.step }} + + + + + + Close + + + + Cancel + Confirm + + + + Acknowledge + + + Popover target + + Tooltip content rendered via template. + + Get started + Secondary CTA + + + + + + + + Callouts + + + + This is a {{ type }} callout using the + {{ calloutIconThemes[idx % calloutIconThemes.length] }} + icon theme. + + + + + + Notification + @for (type of notificationTypes; track type) { + + {{ type | titlecase }} notification. Dismiss to trigger logging. + + } + + Dismissed: {{ notificationDismissed }} + + + + Modal & Drawer + + Open Modal + Open Alert Modal + + Toggle Drawer ({{ drawerState.position }}) + + + + + Standard modal content with template driven actions. + + + + + Alert modals demonstrate template headings by reusing tooltip content + template. + + + + Drawer body content. + + + + Tooltip & Popover + + @for (pos of tooltipPositions; track pos) { + + Tooltip {{ pos }} + + } + + + Popover content aligned {{ popoverPositions[1] }} relative to the button. + + + + + + Progress & Skeletons + + + Circular progress + + + + Linear progress + Progress indicator + + + + + Spinner types + + + Skeletons + + + + + + {{ + showFullScreenProgress + ? "Hide Full Screen Loader" + : "Show Full Screen Loader" + }} + + + + + + Temporary notification controller + + Show Notification + + Controller is positioned top-right to ensure attributes are respected. + + + + + + + + Accordion & Tabs + + + + Accordion content for {{ headingSize }} heading. Toggle to emit change + events. + + + + + Last toggle: {{ accordionLastToggle?.heading || "None" }} → + {{ accordionLastToggle?.open }} + + Assigned to me + In progress + + Unassigned cases content. + Cases assigned to me content. + Cases in progress content. + Completed cases content. + + + Selected tab index: {{ tabsState.selected }} + + Segmented Tabs Variant + Assigned to me + In progress + + Unassigned cases content. + Cases assigned to me content. + Cases in progress content. + Completed cases content. + + + + Table & Pagination + + + + + Name + + + + Created + + + Status + Progress + + + + @for (row of pageData; track row.name) { + + {{ row.name }} + {{ row.created }} + {{ row.status }} + {{ row.progress }}% + + } + + + + Last sort: {{ tableSortState.sortBy }} ({{ tableSortState.sortDir }}) + + + + Page: {{ paginationState.page }} / + {{ paginationState.total / paginationState.perPage | number: "1.0-0" }} + + + + Data Grid (Keyboard Navigation) + + The data grid wraps a table to enable keyboard navigation. Use arrow keys to move between cells. + + + + + + Name + Created + Status + Progress + Actions + + + + @for (row of pageData; track row.name) { + + {{ row.name }} + {{ row.created }} + + + + {{ row.progress }}% + + View + + + } + + + + + + Site chrome + + + + Home + + Item 1 + Item 2 + + + + + Hero banner demonstrates background imagery and projected actions. + + + + + Menu heading + + Link A + Link B + + Loose link + + + + Content area with side menu demonstrates layout wrappers. + + + + + + Documentation + Support + + + Copyright 2025 Government of Alberta + + + + + Header menu clicked: {{ headerMenuActivated }} + + + + +
diff --git a/apps/prs/angular/src/app/everything.component.ts b/apps/prs/angular/src/app/everything.component.ts new file mode 100644 index 0000000000..84de89219c --- /dev/null +++ b/apps/prs/angular/src/app/everything.component.ts @@ -0,0 +1,869 @@ +import { CommonModule } from "@angular/common"; +import { Component, signal } from "@angular/core"; +import { FormBuilder, FormGroup, ReactiveFormsModule } from "@angular/forms"; +import { + GoabAccordion, + GoabAppFooter, + GoabAppHeader, + GoabAppHeaderMenu, + GoabBadge, + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabCallout, + GoabCheckbox, + GoabCheckboxList, + GoabChip, + GoabCircularProgress, + GoabColumnLayout, + GoabContainer, + GoabDataGrid, + GoabDatePicker, + GoabDetails, + GoabDivider, + GoabDrawer, + GoabDropdown, + GoabDropdownItem, + GoabFileUploadCard, + GoabFileUploadInput, + GoabFilterChip, + GoabAppFooterMetaSection, + GoabAppFooterNavSection, + GoabFormItem, + GoabFormItemSlot, + GoabFormStep, + GoabFormStepper, + GoabGrid, + GoabHeroBanner, + GoabIcon, + GoabIconButton, + GoabInput, + GoabInputNumber, + GoabLinearProgress, + GoabLink, + GoabMenuAction, + GoabMenuButton, + GoabMicrositeHeader, + GoabModal, + GoabNotification, + GoabPageBlock, + GoabPages, + GoabPagination, + GoabPopover, + GoabRadioGroup, + GoabRadioItem, + GoabSideMenu, + GoabSideMenuGroup, + GoabSideMenuHeading, + GoabSkeleton, + GoabSpacer, + GoabTab, + GoabTable, + GoabTableSortHeader, + GoabTabs, + GoabTemporaryNotificationCtrl, + GoabText, + GoabTextArea, + GoabTooltip, +} from "@abgov/angular-components"; +import { + GoabAccordionHeadingSize, + GoabAccordionIconPosition, + GoabBadgeType, + GoabButtonSize, + GoabButtonType, + GoabButtonVariant, + GoabCalloutIconTheme, + GoabCalloutType, + GoabCalendarOnChangeDetail, + GoabCheckboxListOnChangeDetail, + GoabCheckboxOnChangeDetail, + GoabCircularProgressSize, + GoabCircularProgressVariant, + GoabContainerAccent, + GoabContainerPadding, + GoabContainerType, + GoabContainerWidth, + GoabDatePickerInputType, + GoabDrawerPosition, + GoabDropdownItemMountType, + GoabDropdownOnChangeDetail, + GoabFilterChipTheme, + GoabFormItemLabelSize, + GoabFormItemRequirement, + GoabFileUploadInputOnSelectFileDetail, + GoabFileUploadOnCancelDetail, + GoabFileUploadOnDeleteDetail, + GoabFormStepStatus, + GoabFormStepperOnChangeDetail, + GoabFormStepperType, + GoabIconButtonVariant, + GoabIconType, + GoabInputOnBlurDetail, + GoabInputOnChangeDetail, + GoabInputOnFocusDetail, + GoabInputOnKeyPressDetail, + GoabLinkButtonType, + GoabModalCalloutVariant, + GoabMenuButtonOnActionDetail, + GoabNotificationType, + GoabPaginationOnChangeDetail, + GoabPaginationVariant, + GoabPopoverPosition, + GoabRadioGroupOnChangeDetail, + GoabSkeletonSize, + GoabSkeletonType, + GoabSpinnerSize, + GoabSpinnerType, + GoabTableOnSortDetail, + GoabTableVariant, + GoabTabsOnChangeDetail, + GoabTextAreaOnBlurDetail, + GoabTextAreaOnChangeDetail, + GoabTextAreaOnKeyPressDetail, + GoabTextAreaCountBy, + GoabTextColor, + GoabTextSize, + GoabTooltipHorizontalAlignment, + GoabTooltipPosition, + Spacing, + GoabIconSize, + GoabDatePickerOnChangeDetail, + TemporaryNotification, +} from "@abgov/ui-components-common"; + +type EventLogEntry = { + name: string; + detail: unknown; + timestamp: string; +}; + +interface User { + name: string; + created: string; + status: string; + progress: number; +} + +type SizeCategory = "all" | "big" | "small"; + +type DropdownOption = { value: string; label: string }; + +interface DemoFormValue { + radio: string; + checkbox: boolean; + input: string; + dropdown: string; + date: string | null; + checkboxList: string[]; + textarea: string; +} + +@Component({ + standalone: true, + selector: "abgov-everything", + templateUrl: "./everything.component.html", + styleUrls: ["./everything.component.css"], + imports: [ + CommonModule, + ReactiveFormsModule, + GoabAccordion, + GoabAppFooter, + GoabAppHeader, + GoabAppHeaderMenu, + GoabBadge, + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabCallout, + GoabCheckbox, + GoabCheckboxList, + GoabChip, + GoabCircularProgress, + GoabColumnLayout, + GoabContainer, + GoabDataGrid, + GoabDatePicker, + GoabDetails, + GoabDivider, + GoabDrawer, + GoabDropdown, + GoabDropdownItem, + GoabFileUploadCard, + GoabFileUploadInput, + GoabFilterChip, + GoabAppFooterMetaSection, + GoabAppFooterNavSection, + GoabFormItem, + GoabFormItemSlot, + GoabFormStep, + GoabFormStepper, + GoabGrid, + GoabHeroBanner, + GoabIcon, + GoabIconButton, + GoabInput, + GoabInputNumber, + GoabLinearProgress, + GoabLink, + GoabMenuAction, + GoabMenuButton, + GoabMicrositeHeader, + GoabModal, + GoabNotification, + GoabPageBlock, + GoabPages, + GoabPagination, + GoabPopover, + GoabRadioGroup, + GoabRadioItem, + GoabSideMenu, + GoabSideMenuGroup, + GoabSideMenuHeading, + GoabSkeleton, + GoabSpacer, + GoabTab, + GoabTable, + GoabTableSortHeader, + GoabTabs, + GoabTemporaryNotificationCtrl, + GoabText, + GoabTextArea, + GoabTooltip, + ], +}) +export class EverythingComponent { + readonly accordionHeadingSizes: GoabAccordionHeadingSize[] = ["small", "medium"]; + readonly accordionIconPositions: GoabAccordionIconPosition[] = ["left", "right"]; + readonly badgeTypes: GoabBadgeType[] = [ + "information", + "success", + "important", + "emergency", + "dark", + "midtone", + "light", + "archived", + "aqua", + "black", + "blue", + "green", + "orange", + "pink", + "red", + "violet", + "white", + "yellow", + "aqua-light", + "black-light", + "blue-light", + "green-light", + "orange-light", + "pink-light", + "red-light", + "violet-light", + "yellow-light", + ]; + readonly buttonTypes: GoabButtonType[] = [ + "primary", + "submit", + "secondary", + "tertiary", + "start", + ]; + readonly buttonVariants: GoabButtonVariant[] = ["normal", "destructive", "inverse"]; + readonly buttonSizes: GoabButtonSize[] = ["normal", "compact"]; + readonly calloutTypes: GoabCalloutType[] = [ + "information", + "success", + "important", + "emergency", + "event", + ]; + readonly calloutIconThemes: GoabCalloutIconTheme[] = ["outline", "filled"]; + readonly circularProgressVariants: GoabCircularProgressVariant[] = [ + "inline", + "fullscreen", + ]; + readonly circularProgressSizes: GoabCircularProgressSize[] = ["small", "large"]; + readonly containerTypes: GoabContainerType[] = [ + "interactive", + "non-interactive", + "info", + "error", + "success", + "important", + ]; + readonly containerAccents: Array = [ + undefined, + "thin", + "thick", + "filled", + ]; + readonly containerPaddings: GoabContainerPadding[] = ["compact", "relaxed"]; + readonly containerWidths: GoabContainerWidth[] = ["content", "full"]; + readonly datePickerInputs: GoabDatePickerInputType[] = ["calendar", "input"]; + readonly drawerPositions: GoabDrawerPosition[] = ["left", "right", "bottom"]; + readonly dropdownMountTypes: GoabDropdownItemMountType[] = [ + "append", + "prepend", + "reset", + ]; + readonly filterChipThemes: GoabFilterChipTheme[] = ["outline", "filled"]; + readonly formItemLabelSizes: GoabFormItemLabelSize[] = ["regular", "large"]; + readonly formItemRequirements: GoabFormItemRequirement[] = ["optional", "required"]; + readonly formStepStatuses: GoabFormStepStatus[] = [ + "not-started", + "incomplete", + "complete", + ]; + readonly formStepperTypes: GoabFormStepperType[] = ["constrained", "free"]; + readonly iconButtonVariants: GoabIconButtonVariant[] = [ + "color", + "nocolor", + "dark", + "light", + "destructive", + ]; + readonly iconTypes: GoabIconType[] = [ + "home", + "alert", + "checkmark-circle", + "information-circle", + "menu", + ]; + readonly linkButtonTypes: GoabLinkButtonType[] = [ + "start", + "primary", + "secondary", + "tertiary", + ]; + readonly paginationVariants: GoabPaginationVariant[] = ["all", "links-only"]; + readonly popoverPositions: GoabPopoverPosition[] = ["auto", "above", "below"]; + readonly spacerSizes: Spacing[] = ["none", "3xs", "2xs", "xs", "s", "m", "l", "xl"]; + readonly spinnerTypes: GoabSpinnerType[] = ["infinite", "progress"]; + readonly spinnerSizes: GoabSpinnerSize[] = ["small", "medium", "large", "xlarge"]; + readonly notificationTypes: GoabNotificationType[] = [ + "information", + "important", + "emergency", + "event", + ]; + readonly modalCalloutVariants: GoabModalCalloutVariant[] = [ + "information", + "important", + "emergency", + "success", + "event", + ]; + readonly skeletonTypes: GoabSkeletonType[] = [ + "text", + "title", + "text-small", + "avatar", + "header", + "paragraph", + "thumbnail", + "card", + "profile", + ]; + readonly skeletonSizes: GoabSkeletonSize[] = ["1", "2", "3", "4"]; + readonly tableVariants: GoabTableVariant[] = ["normal", "relaxed"]; + readonly tooltipPositions: GoabTooltipPosition[] = ["top", "bottom", "left", "right"]; + readonly tooltipAlignments: GoabTooltipHorizontalAlignment[] = [ + "left", + "center", + "right", + ]; + readonly textSizes: GoabTextSize[] = [ + "heading-xl", + "heading-l", + "heading-m", + "heading-s", + "heading-xs", + "body-l", + "body-m", + "body-s", + "body-xs", + ]; + readonly textColors: GoabTextColor[] = ["primary", "secondary"]; + readonly textareaCountByOptions: GoabTextAreaCountBy[] = ["", "character", "word"]; + + readonly eventLog = signal([]); + + readonly linkedDropdownCategories: Array<{ value: SizeCategory; label: string }> = [ + { value: "all", label: "All" }, + { value: "big", label: "Big" }, + { value: "small", label: "Small" }, + ]; + private readonly linkedDropdownItems: Record = { + all: [ + { value: "elephant", label: "Elephant" }, + { value: "truck", label: "Truck" }, + { value: "bus", label: "Bus" }, + { value: "key", label: "Key" }, + { value: "pen", label: "Pen" }, + { value: "watch", label: "Watch" }, + ], + big: [ + { value: "elephant", label: "Elephant" }, + { value: "truck", label: "Truck" }, + { value: "bus", label: "Bus" }, + ], + small: [ + { value: "key", label: "Key" }, + { value: "pen", label: "Pen" }, + { value: "watch", label: "Watch" }, + ], + }; + linkedDropdownCategory: SizeCategory = "all"; + linkedDropdownItem = ""; + dependentDropdownItems: DropdownOption[] = [...this.linkedDropdownItems.all]; + + showFullScreenProgress = false; + + readonly reactiveFormInitialValue: DemoFormValue = { + radio: "pickup", + checkbox: false, + input: "", + dropdown: "", + date: null, + checkboxList: [], + textarea: "", + }; + readonly reactiveRadioOptions: DropdownOption[] = [ + { value: "pickup", label: "Pickup" }, + { value: "delivery", label: "Delivery" }, + { value: "courier", label: "Courier" }, + ]; + readonly reactiveCheckboxListOptions: DropdownOption[] = [ + { value: "apples", label: "Apples" }, + { value: "bananas", label: "Bananas" }, + { value: "pears", label: "Pears" }, + ]; + readonly reactiveDropdownOptions: DropdownOption[] = [ + { value: "option-a", label: "Option A" }, + { value: "option-b", label: "Option B" }, + { value: "option-c", label: "Option C" }, + ]; + reactiveDemoForm!: FormGroup; + + checkboxValue = false; + checkboxListSelection: string[] = []; + dropdownSelection?: string; + dropdownMultiSelection?: string; + selectedRadio = "option-1"; + datePickerValue = "2025-05-15"; + datePickerInputValue: string | Date | undefined = "2025-05-20"; + textInputValue = "Sample value"; + numberInputValue = 42; + textareaValue = "Sample multiline text\nsecond line"; + spinnerProgress = 65; + paginationState = { page: 1, perPage: 10, total: 75, offset: 0 }; + tableSortState: GoabTableOnSortDetail = { sortBy: "name", sortDir: -1 }; + tabsState = { selected: 1 }; + formStepperState = { step: 1 }; + drawerState = { open: false, position: "right" as GoabDrawerPosition }; + modalState = { standard: false, alert: false }; + notificationDismissed = false; + heroBannerExpanded = true; + accordionLastToggle?: { heading: string; open: boolean }; + calendarSelectedDate?: string; + chipClicks = 0; + filterChipClicks = 0; + fileUploadCardEvents: string[] = []; + fileUploadInputFiles: string[] = []; + headerMenuActivated = false; + iconButtonClickCount: Record = { + color: 0, + nocolor: 0, + dark: 0, + light: 0, + destructive: 0, + }; + inputTrailingClicks = 0; + numberInputTrailingClicks = 0; + menuAction?: string; + readonly tabItems = [ + { id: "tab-1", heading: "Overview" }, + { id: "tab-2", heading: "Details" }, + { id: "tab-3", heading: "Attachments" }, + ]; + pageData: User[] = []; + readonly tableData: User[] = [ + { name: "Nobe Matusiak", created: "2025-04-13", status: "Active", progress: 60 }, + { name: "Leighton Frowd", created: "2025-06-19", status: "Active", progress: 24 }, + { name: "Glendon Hardison", created: "2025-09-09", status: "Active", progress: 10 }, + { + name: "Annadiana Delacoste", + created: "2025-06-16", + status: "Paused", + progress: 78, + }, + { name: "Kerwinn Lees", created: "2024-12-09", status: "Active", progress: 100 }, + { name: "Clair Lethbury", created: "2025-04-13", status: "Paused", progress: 86 }, + { name: "Barrie Crotty", created: "2025-05-24", status: "Active", progress: 10 }, + { name: "Bale Starkey", created: "2024-10-21", status: "Active", progress: 53 }, + { name: "Roanne Shildrick", created: "2025-05-11", status: "Active", progress: 74 }, + { name: "Ermin O'Dunneen", created: "2025-08-21", status: "Paused", progress: 50 }, + { name: "Blake Broadhurst", created: "2024-10-21", status: "Active", progress: 95 }, + { name: "Jannelle Derricoat", created: "2025-02-03", status: "Active", progress: 8 }, + { name: "Aron Brammall", created: "2025-02-25", status: "Active", progress: 47 }, + { name: "Eunice Smeuin", created: "2025-01-09", status: "Active", progress: 49 }, + { name: "Delmore Crewes", created: "2025-09-05", status: "Active", progress: 28 }, + { + name: "Rafaellle Serchwell", + created: "2024-11-25", + status: "Active", + progress: 14, + }, + { name: "Flossie Slyford", created: "2025-06-17", status: "Active", progress: 23 }, + { name: "Jeth Pollastro", created: "2025-08-12", status: "Active", progress: 77 }, + { name: "Judie Spivie", created: "2025-04-08", status: "Paused", progress: 62 }, + { name: "Bertine Uphill", created: "2024-12-17", status: "Active", progress: 51 }, + { name: "Anabelle Pretsel", created: "2025-02-05", status: "Paused", progress: 49 }, + { name: "Sarene Kill", created: "2025-04-24", status: "Active", progress: 37 }, + { name: "Dulcie Critten", created: "2025-02-18", status: "Active", progress: 6 }, + { name: "Winnie Beazley", created: "2025-04-27", status: "Active", progress: 88 }, + { name: "Elsworth Ruprechter", created: "2024-12-30", status: "Paused", progress: 8 }, + { name: "Mari Dudliston", created: "2025-09-06", status: "Active", progress: 4 }, + { name: "Bradney Hartigan", created: "2025-04-28", status: "Paused", progress: 63 }, + { + name: "Hedwiga Spellsworth", + created: "2025-07-05", + status: "Active", + progress: 31, + }, + { name: "Misti Fine", created: "2025-02-14", status: "Paused", progress: 38 }, + { name: "Maurene Schurcke", created: "2025-06-09", status: "Active", progress: 84 }, + { name: "Benson Bithell", created: "2025-02-11", status: "Active", progress: 10 }, + { name: "Jenelle Gorke", created: "2025-02-18", status: "Paused", progress: 94 }, + { name: "Emmalyn Cosely", created: "2025-07-03", status: "Paused", progress: 73 }, + { name: "Lucretia Baiss", created: "2025-01-28", status: "Paused", progress: 6 }, + { name: "Neel Flury", created: "2025-10-14", status: "Paused", progress: 7 }, + { name: "Celisse Grennan", created: "2025-06-06", status: "Paused", progress: 78 }, + { name: "Lorena Turbat", created: "2024-12-01", status: "Active", progress: 17 }, + { name: "Kingsly Fairlem", created: "2025-07-16", status: "Paused", progress: 33 }, + { name: "Karlen Bettesworth", created: "2024-11-14", status: "Active", progress: 70 }, + { name: "Rosalinda Ruston", created: "2025-08-25", status: "Active", progress: 43 }, + { name: "Lela Miko", created: "2025-05-11", status: "Active", progress: 2 }, + { name: "Inigo Kitcatt", created: "2024-11-03", status: "Paused", progress: 58 }, + { name: "Harrietta Blabey", created: "2025-03-31", status: "Active", progress: 95 }, + { name: "Hephzibah Hutley", created: "2025-02-09", status: "Active", progress: 61 }, + { name: "Hagan MacCafferky", created: "2025-06-30", status: "Paused", progress: 46 }, + { name: "Georgena Ternent", created: "2025-04-12", status: "Paused", progress: 90 }, + { name: "Ari Giacopello", created: "2025-05-02", status: "Active", progress: 20 }, + { name: "Brandea McCuish", created: "2025-03-03", status: "Paused", progress: 42 }, + { name: "Rooney Nund", created: "2025-04-15", status: "Paused", progress: 9 }, + { name: "Angie Stelfox", created: "2025-07-11", status: "Paused", progress: 18 }, + { name: "Michale Reede", created: "2025-04-16", status: "Active", progress: 36 }, + { name: "Clive Lathbury", created: "2025-04-20", status: "Active", progress: 39 }, + { name: "Bridget Stockey", created: "2025-07-27", status: "Paused", progress: 15 }, + { name: "Bentlee Becaris", created: "2024-11-22", status: "Active", progress: 4 }, + { name: "Lee Schimoni", created: "2024-11-03", status: "Paused", progress: 86 }, + { name: "Abby Yardy", created: "2024-12-13", status: "Paused", progress: 58 }, + { name: "Wilfrid Wornham", created: "2024-12-26", status: "Paused", progress: 69 }, + { name: "Hamid McGerr", created: "2024-12-19", status: "Active", progress: 50 }, + { name: "Brooks Gregon", created: "2025-03-08", status: "Paused", progress: 17 }, + { name: "Gaelan Stoite", created: "2024-10-26", status: "Paused", progress: 49 }, + { name: "Arabella Kepe", created: "2024-12-01", status: "Paused", progress: 3 }, + { name: "Corene Briffett", created: "2025-06-11", status: "Paused", progress: 95 }, + { name: "Gale Jacques", created: "2025-04-24", status: "Active", progress: 16 }, + { name: "Jarvis Swainsbury", created: "2025-08-26", status: "Active", progress: 53 }, + { name: "Georgia Carr", created: "2024-11-06", status: "Paused", progress: 79 }, + { name: "Jerome Bradberry", created: "2025-03-12", status: "Active", progress: 27 }, + { name: "Jeremias Samet", created: "2025-02-23", status: "Active", progress: 52 }, + { name: "Leif Cayford", created: "2025-03-26", status: "Paused", progress: 92 }, + { name: "Avie Parlour", created: "2025-02-07", status: "Active", progress: 59 }, + { name: "Willette Pauletto", created: "2025-03-15", status: "Active", progress: 44 }, + { name: "Mahala Sherwill", created: "2025-05-25", status: "Paused", progress: 46 }, + { name: "Cherie Whether", created: "2024-12-10", status: "Paused", progress: 28 }, + { name: "Corrianne Lack", created: "2025-08-19", status: "Paused", progress: 18 }, + { name: "Andras Elger", created: "2025-08-04", status: "Paused", progress: 25 }, + { name: "Roscoe Savage", created: "2024-11-12", status: "Active", progress: 31 }, + ]; + + logEvent(name: string, detail: unknown) { + console.log(`[feat2802][angular] ${name}`, detail); + const entry: EventLogEntry = { + name, + detail, + timestamp: new Date().toISOString(), + }; + this.eventLog.update((current) => [entry, ...current].slice(0, 50)); + } + + toggleDrawer(position: GoabDrawerPosition) { + this.drawerState = { + open: !this.drawerState.open || this.drawerState.position !== position, + position, + }; + this.logEvent("drawer.toggle", { open: this.drawerState.open, position }); + } + + openModal(kind: "standard" | "alert") { + this.modalState[kind] = true; + this.logEvent(`modal.${kind}.open`, true); + } + + closeModal(kind: "standard" | "alert") { + this.modalState[kind] = false; + this.logEvent(`modal.${kind}.close`, true); + } + + onButtonClick( + type: GoabButtonType, + variant?: GoabButtonVariant, + size?: GoabButtonSize, + ) { + this.logEvent("button.click", { type, variant, size }); + } + + toggleFullScreenProgress() { + this.showFullScreenProgress = !this.showFullScreenProgress; + this.logEvent("circularProgress.fullscreenToggle", { + open: this.showFullScreenProgress, + }); + } + + onAccordionChange(heading: string, open: boolean) { + this.accordionLastToggle = { heading, open }; + this.logEvent("accordion.change", { heading, open }); + } + + onCheckboxChange(detail: GoabCheckboxOnChangeDetail) { + this.checkboxValue = detail.checked; + this.logEvent("checkbox.change", detail); + } + + onCheckboxListChange(detail: GoabCheckboxListOnChangeDetail) { + this.checkboxListSelection = detail.value || []; + this.logEvent("checkboxList.change", detail); + } + + resetReactiveDemoForm() { + this.reactiveDemoForm.reset({ + ...this.reactiveFormInitialValue, + checkboxList: [...this.reactiveFormInitialValue.checkboxList], + }); + this.logEvent("reactiveForm.reset", this.reactiveDemoForm.getRawValue()); + } + + onDropdownChange(detail: GoabDropdownOnChangeDetail) { + this.dropdownSelection = detail.value; + this.dropdownMultiSelection = detail.value; + this.logEvent("dropdown.change", detail); + } + + onLinkedDropdownCategoryChange(detail: GoabDropdownOnChangeDetail) { + const nextCategory = (detail.value as SizeCategory) || "all"; + this.linkedDropdownCategory = nextCategory; + this.dependentDropdownItems = [...this.linkedDropdownItems[nextCategory]]; + if ( + !this.dependentDropdownItems.some((item) => item.value === this.linkedDropdownItem) + ) { + this.linkedDropdownItem = ""; + } + this.logEvent("linkedDropdown.categoryChange", detail); + } + + onLinkedDropdownItemChange(detail: GoabDropdownOnChangeDetail) { + this.linkedDropdownItem = detail.value || ""; + this.logEvent("linkedDropdown.itemChange", detail); + } + + onCalendarChange(detail: GoabCalendarOnChangeDetail) { + this.calendarSelectedDate = detail.value; + this.logEvent("calendar.change", detail); + } + + onChipClick(label: string) { + this.chipClicks += 1; + this.logEvent("chip.click", { label, count: this.chipClicks }); + } + + onFilterChipClick(label: string) { + this.filterChipClicks += 1; + this.logEvent("filterChip.click", { label, count: this.filterChipClicks }); + } + + onRadioChange(detail: GoabRadioGroupOnChangeDetail) { + this.selectedRadio = detail.value; + this.logEvent("radio.change", detail); + } + + onDatePickerChange(detail: GoabDatePickerOnChangeDetail) { + this.datePickerValue = detail.value?.toString() || ""; + this.logEvent("datePicker.change", detail); + } + + onDateInputChange(detail: GoabDatePickerOnChangeDetail) { + this.datePickerInputValue = detail.value; + this.logEvent("datePicker.input", detail); + } + + onInputChange(detail: GoabInputOnChangeDetail) { + this.textInputValue = detail.value; + this.logEvent("input.change", detail); + } + + onInputFocus(detail: GoabInputOnFocusDetail) { + this.logEvent("input.focus", detail); + } + + onInputBlur(detail: GoabInputOnBlurDetail) { + this.logEvent("input.blur", detail); + } + + onInputKeyPress(detail: GoabInputOnKeyPressDetail) { + this.logEvent("input.keyPress", detail); + } + + onInputTrailingIconClick() { + this.inputTrailingClicks += 1; + this.logEvent("input.trailingIconClick", { count: this.inputTrailingClicks }); + } + + onInputNumberChange(detail: GoabInputOnChangeDetail) { + this.numberInputValue = Number(detail.value); + this.logEvent("input-number.change", detail); + } + + onInputNumberTrailingIconClick() { + this.numberInputTrailingClicks += 1; + this.logEvent("input-number.trailingIconClick", { + count: this.numberInputTrailingClicks, + }); + } + + onTextareaChange(detail: GoabTextAreaOnChangeDetail) { + this.textareaValue = detail.value; + this.logEvent("textarea.change", detail); + } + + onTextareaKeyPress(detail: GoabTextAreaOnKeyPressDetail) { + this.logEvent("textarea.keyPress", detail); + } + + onTextareaBlur(detail: GoabTextAreaOnBlurDetail) { + this.logEvent("textarea.blur", detail); + } + + onFileUploadCardCancel(detail: GoabFileUploadOnCancelDetail) { + this.fileUploadCardEvents = [ + `Cancelled: ${detail.filename}`, + ...this.fileUploadCardEvents, + ].slice(0, 5); + this.logEvent("fileUploadCard.cancel", detail); + } + + onFileUploadCardDelete(detail: GoabFileUploadOnDeleteDetail) { + this.fileUploadCardEvents = [ + `Deleted: ${detail.filename}`, + ...this.fileUploadCardEvents, + ].slice(0, 5); + this.logEvent("fileUploadCard.delete", detail); + } + + onFileUploadInputSelect(detail: GoabFileUploadInputOnSelectFileDetail) { + if (detail.file) { + this.fileUploadInputFiles = [detail.file.name, ...this.fileUploadInputFiles].slice( + 0, + 5, + ); + } + this.logEvent("fileUploadInput.select", { + name: detail.file?.name, + size: detail.file?.size, + type: detail.file?.type, + }); + } + + onHeaderMenuClick() { + this.headerMenuActivated = true; + this.logEvent("header.menuClick", {}); + } + + onIconButtonClick(variant: GoabIconButtonVariant) { + this.iconButtonClickCount[variant] = (this.iconButtonClickCount[variant] || 0) + 1; + this.logEvent("iconButton.click", { + variant, + count: this.iconButtonClickCount[variant], + }); + } + + onMenuAction(detail: GoabMenuButtonOnActionDetail) { + this.menuAction = detail.action; + this.logEvent("menu.action", detail); + } + + onPaginationChange(detail: GoabPaginationOnChangeDetail) { + this.paginationState.page = detail.page; + this.paginationState.offset = (detail.page - 1) * this.paginationState.perPage; + this.pageData = this.tableData.slice( + this.paginationState.offset, + this.paginationState.offset + this.paginationState.perPage, + ); + this.logEvent("pagination.change", detail); + } + + onTabsChange(detail: GoabTabsOnChangeDetail) { + this.tabsState.selected = detail.tab; + this.logEvent("tabs.change", detail); + } + + onTableSort(detail: GoabTableOnSortDetail) { + this.tableSortState = detail; + const { sortBy, sortDir } = detail; + this.tableData.sort((a: any, b: any) => (a[sortBy] > b[sortBy] ? 1 : -1) * sortDir); + this.pageData = this.tableData.slice( + this.paginationState.offset, + this.paginationState.offset + this.paginationState.perPage, + ); + this.logEvent("table.sort", detail); + } + + onFormStepperChange(detail: GoabFormStepperOnChangeDetail) { + this.formStepperState.step = detail.step; + this.logEvent("formStepper.change", detail); + } + + onDrawerClose() { + this.drawerState = { ...this.drawerState, open: false }; + this.logEvent("drawer.close", {}); + } + + onModalClose(kind: "standard" | "alert") { + this.modalState[kind] = false; + this.logEvent(`modal.${kind}.closeEvent`, true); + } + + onNotificationDismiss() { + this.notificationDismissed = true; + this.logEvent("notification.dismiss", {}); + } + + showTempNotification() { + TemporaryNotification.show("This is a notification message", { + type: "basic", + duration: "short", + }); + } + + getIconSize(idx: number) { + return ((idx % 6) + 1).toString() as GoabIconSize; + } + + constructor(private readonly fb: FormBuilder) { + this.reactiveDemoForm = this.fb.group({ + radio: this.fb.control(this.reactiveFormInitialValue.radio), + checkbox: this.fb.control(this.reactiveFormInitialValue.checkbox), + input: this.fb.control(this.reactiveFormInitialValue.input), + dropdown: this.fb.control(this.reactiveFormInitialValue.dropdown), + date: this.fb.control(this.reactiveFormInitialValue.date), + checkboxList: this.fb.control([...this.reactiveFormInitialValue.checkboxList]), + textarea: this.fb.control(this.reactiveFormInitialValue.textarea), + }); + this.pageData = this.tableData.slice(0, this.paginationState.perPage); + } +} diff --git a/apps/prs/angular/src/assets/.gitkeep b/apps/prs/angular/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/prs/angular/src/favicon.ico b/apps/prs/angular/src/favicon.ico new file mode 100644 index 0000000000..317ebcb233 Binary files /dev/null and b/apps/prs/angular/src/favicon.ico differ diff --git a/apps/prs/angular/src/index.html b/apps/prs/angular/src/index.html new file mode 100644 index 0000000000..333da64741 --- /dev/null +++ b/apps/prs/angular/src/index.html @@ -0,0 +1,18 @@ + + + + + + Angular Playground + + + + + + + + + + + + diff --git a/apps/prs/angular/src/main.ts b/apps/prs/angular/src/main.ts new file mode 100644 index 0000000000..c8de31031e --- /dev/null +++ b/apps/prs/angular/src/main.ts @@ -0,0 +1,6 @@ +import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; +import { AppModule } from "./app/app.module"; + +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch((err) => console.error(err)); diff --git a/apps/prs/angular/src/routes/bugs/2152/bug2152.component.html b/apps/prs/angular/src/routes/bugs/2152/bug2152.component.html new file mode 100644 index 0000000000..52d0ebe652 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2152/bug2152.component.html @@ -0,0 +1,172 @@ +

Icons in Tooltip

+ + + + + + + + + + +

Custom Icons in Tooltip

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

Icon sizes

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

Custom icon sizes

+ + + + + + + + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2152/bug2152.component.ts b/apps/prs/angular/src/routes/bugs/2152/bug2152.component.ts new file mode 100644 index 0000000000..6f0f9fd26b --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2152/bug2152.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { GoabIcon, GoabTooltip } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-icon", + templateUrl: "./bug2152.component.html", + imports: [GoabIcon, GoabTooltip], +}) +export class Bug2152Component {} diff --git a/apps/prs/angular/src/routes/bugs/2331/bug2331.component.html b/apps/prs/angular/src/routes/bugs/2331/bug2331.component.html new file mode 100644 index 0000000000..31cf240aca --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2331/bug2331.component.html @@ -0,0 +1,35 @@ +
+ Bug #2331: Dynamic Data Test + + + This test demonstrates the dynamic data issue with Block and Tab components. Click the + buttons below to add content dynamically to empty components. + + + + GoabBlock Test + Empty Block component + + {{ blockContent }} + + + Add Content to Block + + + + GoabTabs Test + + Tabs component with one static and one dynamic tab + + + + {{ dynamicTabContent }} + + Static tab content + + + + + Update Dynamic Tab Content + +
diff --git a/apps/prs/angular/src/routes/bugs/2331/bug2331.component.ts b/apps/prs/angular/src/routes/bugs/2331/bug2331.component.ts new file mode 100644 index 0000000000..de59da2671 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2331/bug2331.component.ts @@ -0,0 +1,33 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabBlock, + GoabButton, + GoabTabs, + GoabTab, + GoabText, +} from "@abgov/angular-components"; +import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug2331", + templateUrl: "./bug2331.component.html", + imports: [CommonModule, GoabBlock, GoabButton, GoabTabs, GoabTab, GoabText], +}) +export class Bug2331Component { + blockContent: string | null = null; + dynamicTabContent: string | null = null; + + addBlockContent(): void { + this.blockContent = `Content updated at ${new Date().toLocaleString()}`; + } + + updateDynamicTabContent(): void { + this.dynamicTabContent = `Content updated at ${new Date().toLocaleString()}`; + } + + onTabsChange(detail: GoabTabsOnChangeDetail): void { + console.log("Tab changed to", detail.tab); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2393/bug2393.component.css b/apps/prs/angular/src/routes/bugs/2393/bug2393.component.css new file mode 100644 index 0000000000..6fab862c99 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2393/bug2393.component.css @@ -0,0 +1,3 @@ +.pagination-container{ + margin-bottom: 48px; +} diff --git a/apps/prs/angular/src/routes/bugs/2393/bug2393.component.html b/apps/prs/angular/src/routes/bugs/2393/bug2393.component.html new file mode 100644 index 0000000000..b41a99d947 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2393/bug2393.component.html @@ -0,0 +1,56 @@ + + + + + + Claim ID + + + + + Program ID + + + + + Program Name + + + + + Claim Period + + + + + Claim Status + + + Action + + + + + 000001 + 80000225 + MI CASA MONTESSORI LTD. + July 2025 + + + + + + + Claim submission report + + + Educators' submission report + + + Click me + + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2393/bug2393.component.ts b/apps/prs/angular/src/routes/bugs/2393/bug2393.component.ts new file mode 100644 index 0000000000..4cf191cbe3 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2393/bug2393.component.ts @@ -0,0 +1,27 @@ +import { Component } from "@angular/core"; +import { + GoabTable, + GoabBadge, + GoabPopover, + GoabButton, + GoabTableSortHeader, + GoabTableOnSortDetail, +} from "@abgov/angular-components"; + +@Component({ + selector: "abgov-bug2393", + standalone: true, + templateUrl: "./bug2393.component.html", + styleUrls: ["./bug2393.component.css"], + imports: [GoabTable, GoabTableSortHeader, GoabBadge, GoabPopover, GoabButton], +}) +export class Bug2393Component { + handleClick(event: Event) { + console.log("Click event: ", event); + } + + handleSort(event: GoabTableOnSortDetail) { + console.log("Sorting Direction: ", event.sortDir); + console.log("Sorting By: ", event.sortBy); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2404/bug2404.component.html b/apps/prs/angular/src/routes/bugs/2404/bug2404.component.html new file mode 100644 index 0000000000..75234233d2 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2404/bug2404.component.html @@ -0,0 +1,11 @@ + +
+ +
+ diff --git a/apps/prs/angular/src/routes/bugs/2404/bug2404.component.ts b/apps/prs/angular/src/routes/bugs/2404/bug2404.component.ts new file mode 100644 index 0000000000..860bde5e1a --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2404/bug2404.component.ts @@ -0,0 +1,18 @@ +import { Component } from "@angular/core"; +import { GoabInput, GoabIcon } from "@abgov/angular-components"; +import { FormControl } from "@angular/forms"; + +@Component({ + selector: "abgov-bug2404", + standalone: true, + templateUrl: "./bug2404.component.html", + imports: [GoabInput, GoabIcon], +}) +export class Bug2404Component { + firstName = new FormControl(""); + lastName = new FormControl(""); + + trailingIconClick() { + console.log("Trailing Icon Clicked"); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2408/bug2408.component.html b/apps/prs/angular/src/routes/bugs/2408/bug2408.component.html new file mode 100644 index 0000000000..26ee25a899 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2408/bug2408.component.html @@ -0,0 +1,88 @@ +Bug 2408: Form Stepper "Incomplete" Status Fix + + Testing the fix for Form Stepper where "incomplete" status was being rendered as + "Partially complete" instead of "Incomplete". + + + +
+ Form Stepper with Different Status Types + + This demonstrates the corrected status display for each step status type. + + + + + + + + +
+ +
+ Status Test Controls + Use these buttons to test different step combinations: + + + + Step 1 (Complete) + + + Step 2 (Incomplete) + + + Step 3 (Not Started) + + + Step 4 (Not Started) + + +
+ +
+ Test Results + + Current Step: {{ currentStep }} + Expected Status Display: +
    +
  • Step 1: Complete (green checkmark)
  • +
  • + Step 2: Incomplete (red X - was previously showing "Partially + complete") +
  • +
  • Step 3: Not Started (gray circle - new status type)
  • +
  • Step 4: Not Started (gray circle - new status type)
  • +
+
+
+ +
+ Bug Description + + + Issue: The "incomplete" status was being incorrectly rendered as + "Partially complete" in the Form Stepper component. + + + Fix: Updated the status display logic to properly show + "Incomplete" for the "incomplete" status. + + + Additional: Added new "not-started" status option to replace + "unstarted" for better clarity. + + +
+ +
+ Accessibility Testing + + Screen readers should announce steps in the format: "Step X of Y, Step name: [Name], + Status: [Status]" + + + When clicking step navigation buttons, the screen reader should announce the step + change immediately. + +
+
diff --git a/apps/prs/angular/src/routes/bugs/2408/bug2408.component.ts b/apps/prs/angular/src/routes/bugs/2408/bug2408.component.ts new file mode 100644 index 0000000000..f8ba2b4964 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2408/bug2408.component.ts @@ -0,0 +1,29 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabFormStepper, + GoabFormStep, + GoabBlock, + GoabText, + GoabButton, + GoabFormStepperOnChangeDetail, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2408", + templateUrl: "./bug2408.component.html", + imports: [CommonModule, GoabFormStepper, GoabFormStep, GoabBlock, GoabText, GoabButton], +}) +export class Bug2408Component { + currentStep = 1; + + handleStepChange(details: GoabFormStepperOnChangeDetail) { + console.log("Step changed:", details); + this.currentStep = details.step; + } + + setStep(step: number) { + this.currentStep = step; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2459/bug2459.component.html b/apps/prs/angular/src/routes/bugs/2459/bug2459.component.html new file mode 100644 index 0000000000..4da275e613 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2459/bug2459.component.html @@ -0,0 +1,17 @@ + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2459/bug2459.component.ts b/apps/prs/angular/src/routes/bugs/2459/bug2459.component.ts new file mode 100644 index 0000000000..612b676059 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2459/bug2459.component.ts @@ -0,0 +1,78 @@ +import { Component } from "@angular/core"; +import { + GoabFormItem, + GoabFileUploadCard, + GoabFileUploadInput, + GoabFileUploadInputOnSelectFileDetail, +} from "@abgov/angular-components"; +import { NgFor } from "@angular/common"; + +interface Uploader { + upload: (url: string | ArrayBuffer) => void; + abort: () => void; +} +interface Upload { + file: File; + uploader: Uploader; +} +class MockUploader implements Uploader { + public onprogress: (percent: number) => void = (_: number) => { + /* This function intentionally does nothing */ + }; + public onabort: () => void = () => { + /* This function intentionally does nothing */ + }; + public onfail: (err: string) => void = (_: string) => { + /* This function intentionally does nothing */ + }; + public oncomplete: () => void = () => { + /* This function intentionally does nothing */ + }; + + upload(_url: string | ArrayBuffer) { + /* This function intentionally does nothing */ + } + + abort() { + /* This function intentionally does nothing */ + } +} + +@Component({ + selector: "abgov-accordion", + standalone: true, + templateUrl: "./bug2459.component.html", + imports: [GoabFormItem, GoabFileUploadCard, GoabFileUploadInput, NgFor], +}) +export class Bug2459Component { + uploads: Upload[] = []; + progressList: Record = {}; + + uploadFile(e: GoabFileUploadInputOnSelectFileDetail) { + const reader = new FileReader(); + const file = e.file; + reader.onload = (e: ProgressEvent) => { + if (!e.target) return; + const url = e.target.result; + const uploader = new MockUploader(); + + this.uploads.push({ file, uploader }); + + uploader.onabort = () => console.log("Aborting upload"); + uploader.onfail = (err) => console.log("Upload failed: ", err); + uploader.oncomplete = () => console.log("File upload complete"); + uploader.onprogress = (percent) => { + this.progressList[file.name] = percent; + }; + if (url) { + uploader.upload(url); + } + }; + reader.readAsDataURL(file); + } + + deleteFile(upload: Upload) { + upload.uploader.abort(); + this.uploads = this.uploads.filter((u) => u.file.name !== upload.file.name); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2473/bug2473.component.css b/apps/prs/angular/src/routes/bugs/2473/bug2473.component.css new file mode 100644 index 0000000000..e1f8d70853 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2473/bug2473.component.css @@ -0,0 +1,41 @@ +/* Bug 2473 Test Component Styles */ + +h1 { + color: #333; + margin-bottom: 1rem; +} + +h2 { + color: #555; + margin-bottom: 0.5rem; +} + +h3 { + color: #666; + margin-bottom: 0.5rem; +} + +p { + margin-bottom: 1rem; +} + +ul { + margin-bottom: 1rem; +} + +li { + margin-bottom: 0.25rem; +} + +a { + color: #0066cc; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +strong { + font-weight: 600; +} \ No newline at end of file diff --git a/apps/prs/angular/src/routes/bugs/2473/bug2473.component.html b/apps/prs/angular/src/routes/bugs/2473/bug2473.component.html new file mode 100644 index 0000000000..4d955fa0cd --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2473/bug2473.component.html @@ -0,0 +1,102 @@ + +

Bug 2473: Date Picker Ordinal Suffix Test

+ +

+ This test page is for manually testing GitHub issue + #2473: "Remove ordinal suffixes from date picker display" +

+ +

+ Expected Behavior: Date picker should display dates in the format + "Month Day, Year" without ordinal suffixes (e.g., "July 10, 2025" instead of "July + 10th, 2025") +

+ + + +

Test 1: Date Picker with Default Value

+

This date picker has a default value set to 1 month in the past:

+ + + + + Selected Value: + {{ datePicker1Display }} + +
+ + + +

Test 2: Date Picker with Min/Max Constraints

+

+ This date picker has constraints: min = 2 months in the past, max = 2 months in the + future: +

+ + + + + Selected Value: + {{ datePicker2Display }} + +
+ + + +

Test 3: Date Picker with Input Type

+

This date picker uses type="input" instead of the default calendar type:

+ + + + + Selected Value: + {{ datePicker3Display }} + +
+ + + +

Expected vs Actual Behavior

+ + +

Expected Behavior (After Fix)

+
    +
  • Date picker displays dates as "Month Day, Year" (e.g., "July 10, 2025")
  • +
  • No ordinal suffixes (st, nd, rd, th) in the display
  • +
  • Consistent formatting across all date picker types
  • +
  • No impact on date input or validation functionality
  • +
+
+ + +

Actual Behavior (Before Fix)

+
    +
  • + Date picker displays dates with ordinal suffixes (e.g., "July 10th, 2025") +
  • +
  • Inconsistent with desired format
  • +
  • May affect user experience and design consistency
  • +
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2473/bug2473.component.ts b/apps/prs/angular/src/routes/bugs/2473/bug2473.component.ts new file mode 100644 index 0000000000..ce5817e3a9 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2473/bug2473.component.ts @@ -0,0 +1,67 @@ +import { Component } from "@angular/core"; +import { GoabDatePicker, GoabBlock } from "@abgov/angular-components"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + imports: [GoabDatePicker, GoabBlock], + templateUrl: "./bug2473.component.html", + styleUrls: ["./bug2473.component.css"], +}) +export class Bug2473Component { + // Date picker 1: Default value of 1 month in the past + datePicker1Value: Date | null = new Date(); + datePicker1Display = ""; + + // Date picker 2: Min/max constraints (2 months past to 2 months future) + datePicker2Value: Date | null = null; + datePicker2Display = ""; + datePicker2Min: Date = new Date(); + datePicker2Max: Date = new Date(); + + // Date picker 3: Input type + datePicker3Value: Date | null = null; + datePicker3Display = ""; + + constructor() { + // Set default value for date picker 1 (1 month in the past) + const oneMonthAgo = new Date(); + oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1); + this.datePicker1Value = oneMonthAgo; + this.datePicker1Display = this.formatDate(oneMonthAgo); + + // Set min/max constraints for date picker 2 + const twoMonthsAgo = new Date(); + twoMonthsAgo.setMonth(twoMonthsAgo.getMonth() - 2); + this.datePicker2Min = twoMonthsAgo; + + const twoMonthsFuture = new Date(); + twoMonthsFuture.setMonth(twoMonthsFuture.getMonth() + 2); + this.datePicker2Max = twoMonthsFuture; + } + + onDatePicker1Change(event: GoabDatePickerOnChangeDetail) { + this.datePicker1Value = event.value as Date | null; + this.datePicker1Display = this.formatDate(event.value as Date | null); + } + + onDatePicker2Change(event: GoabDatePickerOnChangeDetail) { + this.datePicker2Value = event.value as Date | null; + this.datePicker2Display = this.formatDate(event.value as Date | null); + } + + onDatePicker3Change(event: GoabDatePickerOnChangeDetail) { + console.log("Date Picker 3 changed: ", event.value); + this.datePicker3Value = event.value as Date | null; + this.datePicker3Display = this.formatDate(event.value as Date | null); + } + + private formatDate(date: Date | null): string { + if (!date) return "No date selected"; + return date.toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + }); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2502/bug2502.component.html b/apps/prs/angular/src/routes/bugs/2502/bug2502.component.html new file mode 100644 index 0000000000..2f2624f421 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2502/bug2502.component.html @@ -0,0 +1,25 @@ +
+

Bug 2502 - Dropdown Test

+ + + + + + + + + + + + + + + + + + +
diff --git a/apps/prs/angular/src/routes/bugs/2502/bug2502.component.ts b/apps/prs/angular/src/routes/bugs/2502/bug2502.component.ts new file mode 100644 index 0000000000..5670f1a0a1 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2502/bug2502.component.ts @@ -0,0 +1,20 @@ +import { Component } from "@angular/core"; +import { + GoabBlock, + GoabFormItem, + GoabDropdown, + GoabDropdownItem, + GoabDropdownOnChangeDetail, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2502", + templateUrl: "./bug2502.component.html", + imports: [GoabBlock, GoabFormItem, GoabDropdown, GoabDropdownItem], +}) +export class Bug2502Component { + onDropdownChange(details: GoabDropdownOnChangeDetail) { + console.log(`Dropdown ${details.name} selected value:`, details.value); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2529/bug2529.component.css b/apps/prs/angular/src/routes/bugs/2529/bug2529.component.css new file mode 100644 index 0000000000..76b4366f89 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2529/bug2529.component.css @@ -0,0 +1,52 @@ +/* Bug 2529 Component Styles */ +main { + padding: 20px; +} + +h2 { + color: #333; + margin-bottom: 16px; +} + +h3 { + color: #555; + margin-top: 32px; + margin-bottom: 16px; +} + +p { + margin-bottom: 16px; + line-height: 1.5; +} + +code { + background-color: #f5f5f5; + padding: 2px 4px; + border-radius: 3px; + font-family: monospace; +} + +ul { + margin-bottom: 16px; +} + +li { + margin-bottom: 8px; +} + +/* Debug styles to help visualize the issue */ +.debug-container { + position: relative; +} + +.debug-container::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 2px dashed red; + pointer-events: none; + z-index: 1; +} \ No newline at end of file diff --git a/apps/prs/angular/src/routes/bugs/2529/bug2529.component.html b/apps/prs/angular/src/routes/bugs/2529/bug2529.component.html new file mode 100644 index 0000000000..1a73a26ece --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2529/bug2529.component.html @@ -0,0 +1,100 @@ +
+

Bug 2529: Input Width Not Being Correctly Generated

+

+ Testing input width issues with grid layout and flex layout as described in GitHub + issue #2529 +

+ +

Test 1: With Grid Component

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

Test 2: Without Grid Component (Flex Layout)

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

Test 3: Individual Input Width Tests

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

Issue Description

+

+ The issue occurs when the goab-input component uses minimum width, but + the input component inside takes up more width than given. This could be related to + the padding property. +

+ +

Expected Behavior

+
    +
  • Input components should respect their container width constraints
  • +
  • + Width for the inner input component should be correct relative to the outer parent + component +
  • +
  • No overflow beyond the allocated container width
  • +
+ +

Current Values

+

Meridan: {{ meridanValue || "Empty" }}

+

Range: {{ rangeValue || "Empty" }}

+

Township: {{ townshipValue || "Empty" }}

+
diff --git a/apps/prs/angular/src/routes/bugs/2529/bug2529.component.ts b/apps/prs/angular/src/routes/bugs/2529/bug2529.component.ts new file mode 100644 index 0000000000..1fa0d8b5bf --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2529/bug2529.component.ts @@ -0,0 +1,32 @@ +import { Component } from "@angular/core"; +import { + GoabFormItem, + GoabInput, + GoabGrid, + GoabInputOnChangeDetail, +} from "@abgov/angular-components"; + +@Component({ + selector: "abgov-bug2529", + standalone: true, + templateUrl: "./bug2529.component.html", + styleUrls: ["./bug2529.component.css"], + imports: [GoabFormItem, GoabInput, GoabGrid], +}) +export class Bug2529Component { + meridanValue = ""; + rangeValue = ""; + townshipValue = ""; + + onMeridanChange(detail: GoabInputOnChangeDetail) { + this.meridanValue = detail.value; + } + + onRangeChange(detail: GoabInputOnChangeDetail) { + this.rangeValue = detail.value; + } + + onTownshipChange(detail: GoabInputOnChangeDetail) { + this.townshipValue = detail.value; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2547/bug2547.component.css b/apps/prs/angular/src/routes/bugs/2547/bug2547.component.css new file mode 100644 index 0000000000..6f3d039a8d --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2547/bug2547.component.css @@ -0,0 +1,8 @@ +a.styled { + display: block; + font: var(--goa-typography-body-s); + padding: var(--goa-space-s) var(--goa-space-s) var(--goa-space-s) var(--goa-space-s); + text-decoration: none; + color: var(--goa-color-text-default)!important; + white-space: nowrap; +} \ No newline at end of file diff --git a/apps/prs/angular/src/routes/bugs/2547/bug2547.component.html b/apps/prs/angular/src/routes/bugs/2547/bug2547.component.html new file mode 100644 index 0000000000..877119c0a0 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2547/bug2547.component.html @@ -0,0 +1,29 @@ + + + + + + + Angular + + + Angular + React + + + + + Click me + +

This is a popover

+ It can be used for a number of different contexts. +
+
+
+ +Notification banner message diff --git a/apps/prs/angular/src/routes/bugs/2547/bug2547.component.ts b/apps/prs/angular/src/routes/bugs/2547/bug2547.component.ts new file mode 100644 index 0000000000..9fc72f1a60 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2547/bug2547.component.ts @@ -0,0 +1,25 @@ +import { Component } from "@angular/core"; +import { + GoabTooltip, + GoabPopover, + GoabIcon, + GoabMicrositeHeader, + GoabButton, + GoabNotification, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2547", + templateUrl: "./bug2547.component.html", + styleUrls: ["./bug2547.component.css"], + imports: [ + GoabTooltip, + GoabPopover, + GoabIcon, + GoabMicrositeHeader, + GoabButton, + GoabNotification, + ], +}) +export class Bug2547Component {} diff --git a/apps/prs/angular/src/routes/bugs/2655/bug2655.component.ts b/apps/prs/angular/src/routes/bugs/2655/bug2655.component.ts new file mode 100644 index 0000000000..184fe78c12 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2655/bug2655.component.ts @@ -0,0 +1,135 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabButton, + GoabModal, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, +} from "@abgov/angular-components"; + +@Component({ + selector: "abgov-bug2655", + standalone: true, + imports: [ + CommonModule, + GoabButton, + GoabModal, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, + ], + template: ` +
+

Bug 2655 - Modal with Date Pickers and Dropdowns

+

This page tests the integration of modals with form components.

+ + Open Modal + + +
+
+ + + +
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae + ultricies leo. Cras sodales lacinia sagittis. Aliquam viverra, risus quis + imperdiet euismod, libero lacus blandit tortor, vel tristique est sapien sed + urna. Phasellus convallis auctor leo sed volutpat. Sed vel arcu suscipit, + porta augue et, vehicula felis. Pellentesque at pulvinar velit. Phasellus + lacus metus, dictum vel ultricies eu, rutrum eu nibh. Curabitur at dapibus + ligula. Nam nulla massa, egestas vitae urna a, maximus aliquam leo. + Suspendisse condimentum condimentum nunc, eu pulvinar tellus convallis sed. + Praesent non mauris quis diam feugiat gravida nec porta ipsum. Proin elementum + nibh eu tellus porta, sed rhoncus felis dictum. Nullam mattis purus at urna + convallis vulputate. Sed aliquet maximus varius. Sed aliquet mi eget arcu + ullamcorper tempor. Etiam condimentum fermentum lacus, sed ultricies velit + scelerisque id. +

+
+ + + +
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae + ultricies leo. Cras sodales lacinia sagittis. Aliquam viverra, risus quis + imperdiet euismod, libero lacus blandit tortor, vel tristique est sapien sed + urna. Phasellus convallis auctor leo sed volutpat. Sed vel arcu suscipit, + porta augue et, vehicula felis. Pellentesque at pulvinar velit. Phasellus + lacus metus, dictum vel ultricies eu, rutrum eu nibh. Curabitur at dapibus + ligula. Nam nulla massa, egestas vitae urna a, maximus aliquam leo. + Suspendisse condimentum condimentum nunc, eu pulvinar tellus convallis sed. + Praesent non mauris quis diam feugiat gravida nec porta ipsum. Proin elementum + nibh eu tellus porta, sed rhoncus felis dictum. Nullam mattis purus at urna + convallis vulputate. Sed aliquet maximus varius. Sed aliquet mi eget arcu + ullamcorper tempor. Etiam condimentum fermentum lacus, sed ultricies velit + scelerisque id. +

+
+ + + + + + + +
+ +
+ + + + + + + +
+
+
+
+ `, + styles: [], +}) +export class Bug2655Component { + isModalOpen = false; + + openModal() { + this.isModalOpen = true; + } + + closeModal() { + this.isModalOpen = false; + } + + onDate1Change(event: any) { + console.log("Date 1 changed:", event); + } + + onDate2Change(event: any) { + console.log("Date 2 changed:", event); + } + + onDropdown1Change(event: any) { + console.log("Dropdown 1 changed:", event); + } + + onDropdown2Change(event: any) { + console.log("Dropdown 2 changed:", event); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2720/bug2720.component.css b/apps/prs/angular/src/routes/bugs/2720/bug2720.component.css new file mode 100644 index 0000000000..612e9d2bc2 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2720/bug2720.component.css @@ -0,0 +1,20 @@ +/* Bug 2720 Component Styles */ +main { + padding: 1rem; +} + +section { + margin-bottom: 2rem; +} + +ol, ul { + margin-left: 1.5rem; +} + +li { + margin-bottom: 0.5rem; +} + +div.hello { + text-decoration: underline; +} \ No newline at end of file diff --git a/apps/prs/angular/src/routes/bugs/2720/bug2720.component.html b/apps/prs/angular/src/routes/bugs/2720/bug2720.component.html new file mode 100644 index 0000000000..cacc342c53 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2720/bug2720.component.html @@ -0,0 +1,171 @@ +
+ Bug 2720: Tabs Not Switching via URL Changes + + Testing the tabs component bug where changing the URL hash doesn't switch the active + tab. This should be fixed by PR #2830. + + + +
+ Test Instructions + + Test the following scenarios to verify the tabs component responds to URL changes: + +
    +
  1. + Direct URL Hash: Click the buttons below to change URL hash +
  2. +
  3. + Link Navigation: Click the links inside the tabs to navigate to + other tabs +
  4. +
  5. + Programmatic Change: Use the "Simulate Search" button to test + programmatic tab switching +
  6. +
  7. + Manual URL: Manually change the URL hash in the browser address + bar +
  8. +
+
+ +
+ Test Controls + + + Switch to Profile Tab + + + Switch to Settings Tab + + + Switch to Help Tab + + + Simulate Search (Switch to Settings) + + + Reset Log + + + + + Current Tab: {{ currentTab }} ({{ getTabName(currentTab) }}) + +
+ +
+ Tabs Component Test + + +
+
Unread
+
+ +
+
+ + Profile Tab Content + + This is the Profile tab. You can navigate to other tabs using the links + below: + + + Go to Settings Tab + Go to Help Tab + + + Expected Behavior: Clicking these links should change the + URL and switch the active tab. + + +
+ + + + Settings Tab Content + + This is the Settings tab. You can navigate to other tabs using the links + below: + + + Go to Profile Tab + Go to Help Tab + + + Expected Behavior: Clicking these links should change the + URL and switch the active tab. + + + + + + + Help Tab Content + + This is the Help tab. You can navigate to other tabs using the links below: + + + Go to Profile Tab + Go to Settings Tab + + + Expected Behavior: Clicking these links should change the + URL and switch the active tab. + + + +
+
+ +
+ Tab Change Event Log +
+
+ {{ log }} +
+
+ + +
+ + No tab change events yet. Try changing tabs or using the test controls above. + +
+
+
+ +
+ Expected Behavior (After Fix): +
    +
  • URL hash changes should automatically switch the active tab
  • +
  • Links within tabs should navigate to other tabs
  • +
  • Programmatic URL changes should trigger tab switches
  • +
  • Manual URL hash changes should work
  • +
  • All tab change events should be logged
  • +
+
+ +
+ Bug Description: + + Before the fix, changing the URL hash (via links, programmatic changes, or manual + entry) would update the URL but not switch the active tab. The tabs component + wasn't listening for hash change events. + +
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2720/bug2720.component.ts b/apps/prs/angular/src/routes/bugs/2720/bug2720.component.ts new file mode 100644 index 0000000000..77edd949a0 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2720/bug2720.component.ts @@ -0,0 +1,67 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabTabs, + GoabTab, + GoabBlock, + GoabText, + GoabButton, + GoabLink, + GoabBadge, +} from "@abgov/angular-components"; +import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug2720", + templateUrl: "./bug2720.component.html", + styleUrls: ["./bug2720.component.css"], + imports: [ + CommonModule, + GoabTabs, + GoabTab, + GoabBlock, + GoabText, + GoabButton, + GoabLink, + GoabBadge, + ], +}) +export class Bug2720Component { + currentTab = 0; + tabChangeLog: string[] = []; + + handleTabChange(detail: GoabTabsOnChangeDetail) { + this.currentTab = detail.tab; + const logEntry = `Tab changed to: ${detail.tab} (${this.getTabName(detail.tab)})`; + this.tabChangeLog.push(logEntry); + console.log("Tab change event:", detail); + } + + getTabName(tabIndex: number): string { + const tabNames = ["Profile", "Settings", "Help"]; + return tabNames[tabIndex] || `Tab ${tabIndex}`; + } + + resetTest() { + this.tabChangeLog = []; + } + + // Function to programmatically change URL hash + changeToTab(tabIndex: number) { + const newHash = `tab-${tabIndex}`; + window.location.hash = newHash; + console.log(`Programmatically changed URL to: #${newHash}`); + } + + // Function to simulate search functionality that switches to first non-empty tab + simulateSearch() { + // Simulate finding results in tab 2 (Settings) + console.log("Search completed - switching to Settings tab (tab 2)"); + this.changeToTab(2); + } + + trackByIndex(index: number): number { + return index; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2721/bug2721.component.css b/apps/prs/angular/src/routes/bugs/2721/bug2721.component.css new file mode 100644 index 0000000000..1aa988d373 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2721/bug2721.component.css @@ -0,0 +1,6 @@ +.test-container { + border: 1px dashed #aaa; + padding: 16px; + margin-bottom: 24px; + background: #fafbfc; +} \ No newline at end of file diff --git a/apps/prs/angular/src/routes/bugs/2721/bug2721.component.html b/apps/prs/angular/src/routes/bugs/2721/bug2721.component.html new file mode 100644 index 0000000000..59e3e2fccb --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2721/bug2721.component.html @@ -0,0 +1,87 @@ +

GoabText Margin Bug Test (Issue #2721)

+

Testing that changing the "tag" property on GoabText should not change the margin

+ + + + +

Issue Description

+

+ According to + GitHub issue #2721, changing the tag property on GoabText should not change the margin. + The margin should be determined by the variant property only. +

+
+ + + +

Margin Reference Test

+

Compare margins across different variants with the same tag:

+ +
+ Heading XL (should have L bottom margin, 2XL top margin) + Heading L (should have L bottom margin, 2XL top margin) + Heading M (should have M bottom margin, 2XL top margin) + Heading S (should have S bottom margin, XL top margin) + Heading XS (should have XS bottom margin, XL top margin) + Body L (should have L bottom margin, 2XL top margin) + Body M (should have L bottom margin, L top margin) + Body S (should have L bottom margin, L top margin) + Body XS (should have L bottom margin, S top margin) +
+
+ + + +

Tag Consistency Test

+

All of these should have identical margins (body-m variant):

+ +
+ H1 tag with body-m size + H2 tag with body-m size + H3 tag with body-m size + P tag with body-m size + Span tag with body-m size + Div tag with body-m size +
+
+ + + +

Expected vs Actual Behavior

+

If the bug is fixed, changing the tag should not affect margins:

+ +
+

Expected: Same margins regardless of tag

+ H1 with heading-m (should match below) + P with heading-m (should match above) + Span with heading-m (should match above) +
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2721/bug2721.component.ts b/apps/prs/angular/src/routes/bugs/2721/bug2721.component.ts new file mode 100644 index 0000000000..a01e27f175 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2721/bug2721.component.ts @@ -0,0 +1,13 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { GoabText, GoabBlock } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2721", + templateUrl: "./bug2721.component.html", + styleUrls: ["./bug2721.component.css"], + imports: [CommonModule, GoabText, GoabBlock], + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class Bug2721Component {} diff --git a/apps/prs/angular/src/routes/bugs/2750/bug2750.component.html b/apps/prs/angular/src/routes/bugs/2750/bug2750.component.html new file mode 100644 index 0000000000..5c7a55f106 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2750/bug2750.component.html @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2750/bug2750.component.ts b/apps/prs/angular/src/routes/bugs/2750/bug2750.component.ts new file mode 100644 index 0000000000..2535724c18 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2750/bug2750.component.ts @@ -0,0 +1,20 @@ +import { Component } from "@angular/core"; +import { GoabFormItem, GoabDatePicker } from "@abgov/angular-components"; +import { FormControl } from "@angular/forms"; + +@Component({ + selector: "abgov-accordion", + standalone: true, + templateUrl: "./bug2750.component.html", + imports: [GoabFormItem, GoabDatePicker], +}) +export class Bug2750Component { + public readonly dateToday = new Date( + new Date().setFullYear(new Date().getFullYear() + 100), + ); + public readonly date100YearsAgo = new Date( + new Date().setFullYear(new Date().getFullYear() - 100), + ); + + dob = new FormControl(); +} diff --git a/apps/prs/angular/src/routes/bugs/2768/bug2768.component.html b/apps/prs/angular/src/routes/bugs/2768/bug2768.component.html new file mode 100644 index 0000000000..d68d0597ac --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2768/bug2768.component.html @@ -0,0 +1,59 @@ +
+ Bug #2769: Enable/Disable Test + + + This test demonstrates the enable/disable functionality of various form components. + All components start disabled. Click the buttons to enable each component. + + + + + + + + {{ checkboxDisabled ? "Enable Checkbox" : "Disable Checkbox" }} + + + + + + + + {{ datePickerDisabled ? "Enable DatePicker" : "Disable DatePicker" }} + + + + + + + + {{ dropdownDisabled ? "Enable Dropdown" : "Disable Dropdown" }} + + + + + + + + {{ inputDisabled ? "Enable Input" : "Disable Input" }} + + + + + + + + + + + {{ radioDisabled ? "Enable Radio" : "Disable Radio" }} + + + + + + + + {{ textAreaDisabled ? "Enable TextArea" : "Disable TextArea" }} + +
diff --git a/apps/prs/angular/src/routes/bugs/2768/bug2768.component.ts b/apps/prs/angular/src/routes/bugs/2768/bug2768.component.ts new file mode 100644 index 0000000000..bb2bece191 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2768/bug2768.component.ts @@ -0,0 +1,65 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabButton, + GoabCheckbox, + GoabDatePicker, + GoabDropdown, + GoabFormItem, + GoabInput, + GoabRadioGroup, + GoabRadioItem, + GoabText, + GoabTextArea, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2768", + templateUrl: "./bug2768.component.html", + imports: [ + CommonModule, + GoabButton, + GoabCheckbox, + GoabDatePicker, + GoabDropdown, + GoabFormItem, + GoabInput, + GoabRadioGroup, + GoabRadioItem, + GoabText, + GoabTextArea, + ], +}) +export class Bug2768Component { + checkboxDisabled = true; + datePickerDisabled = true; + dropdownDisabled = true; + inputDisabled = true; + radioDisabled = true; + textAreaDisabled = true; + + toggleCheckbox(): void { + this.checkboxDisabled = !this.checkboxDisabled; + } + + toggleDatePicker(): void { + this.datePickerDisabled = !this.datePickerDisabled; + } + + toggleDropdown(): void { + this.dropdownDisabled = !this.dropdownDisabled; + } + + toggleInput(): void { + this.inputDisabled = !this.inputDisabled; + } + + toggleRadio(): void { + this.radioDisabled = !this.radioDisabled; + } + + toggleTextArea(): void { + this.textAreaDisabled = !this.textAreaDisabled; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2782/bug2782.component.html b/apps/prs/angular/src/routes/bugs/2782/bug2782.component.html new file mode 100644 index 0000000000..e669f97e78 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2782/bug2782.component.html @@ -0,0 +1,113 @@ +

Disabled Inputs Visibility Bug Test (Issue #2782)

+ + + + +

Issue Description

+

+ According to + GitHub issue #2782, disabled inputs are not visible and get hidden by container backgrounds: +

+
    +
  • + Problem: Disabled inputs are not visible regardless of background + color +
  • +
  • + Expected: Disabled inputs should appear no matter the background + colour +
  • +
  • + Fix: Added z-index: 0 to input container styling in web + components +
  • +
+
+ + + +

Test Instructions

+

+ Below are three containers with different background colors, each containing a + disabled GoabTextArea. All disabled textareas should be visible regardless of the + background color. +

+
+ + + +

Test 1: Default Background

+

This container uses the default background color:

+ + + + +
+ + +
+ +

Test 2: Dark Grey Background

+

This container uses a dark grey background color:

+ + + + +
+
+ + +
+ +

Test 3: Red Background

+

+ This container uses a red background color (as mentioned in the original issue): +

+ + + + +
+
+ + + +

Expected vs Actual Behavior

+ +

Expected Behavior (After Fix)

+
    +
  • All disabled textareas should be visible regardless of background color
  • +
  • Disabled textareas should maintain proper contrast and readability
  • +
  • No textareas should be hidden behind container backgrounds
  • +
+
+ + +

Actual Behavior (Before Fix)

+
    +
  • Disabled textareas were not visible against different background colors
  • +
  • + Same issue occurred with red background as mentioned in the original report +
  • +
  • Textareas appeared to be hidden by container backgrounds
  • +
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2782/bug2782.component.ts b/apps/prs/angular/src/routes/bugs/2782/bug2782.component.ts new file mode 100644 index 0000000000..ad7df40c84 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2782/bug2782.component.ts @@ -0,0 +1,15 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { GoabInput, GoabBlock, GoabFormItem } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2782", + templateUrl: "./bug2782.component.html", + imports: [CommonModule, GoabInput, GoabBlock, GoabFormItem], + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class Bug2782Component { + textValue = + "This is a disabled textarea that should be visible regardless of background color."; +} diff --git a/apps/prs/angular/src/routes/bugs/2789/bug2789.component.html b/apps/prs/angular/src/routes/bugs/2789/bug2789.component.html new file mode 100644 index 0000000000..604129609a --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2789/bug2789.component.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2789/bug2789.component.ts b/apps/prs/angular/src/routes/bugs/2789/bug2789.component.ts new file mode 100644 index 0000000000..3560070ea1 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2789/bug2789.component.ts @@ -0,0 +1,18 @@ +import { Component } from "@angular/core"; +import { GoabFormItem, GoabDropdown, GoabDropdownItem } from "@abgov/angular-components"; +import { FormControl } from "@angular/forms"; + +@Component({ + selector: "abgov-accordion", + standalone: true, + templateUrl: "./bug2789.component.html", + imports: [GoabFormItem, GoabDropdown, GoabDropdownItem], +}) +export class Bug2789Component { + firstName = new FormControl(""); + lastName = new FormControl(""); + + trailingIconClick() { + console.log("Trailing Icon Clicked"); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2821/bug2821.component.html b/apps/prs/angular/src/routes/bugs/2821/bug2821.component.html new file mode 100644 index 0000000000..de6fa8b9cd --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2821/bug2821.component.html @@ -0,0 +1,101 @@ +
+ Bug 2821: Table Header Sorting Issue + + Testing the table sorting bug where the first two clicks stay ascending before + toggling to descending. + + + +
+ Test Instructions + + Click on any column header multiple times to test the sorting behavior: + +
    +
  1. Click on "Name" header - should show ascending (first click)
  2. +
  3. Click on "Name" header again - should show descending (second click)
  4. +
  5. Click on "Name" header again - should show ascending (third click)
  6. +
  7. Bug: Currently the first two clicks both show ascending
  8. +
+
+ +
+ Test Table + + + + + ID + + + Name + + + Age + + + Department + + + + + + {{ row.id }} + {{ row.name }} + {{ row.age }} + {{ row.department }} + + + +
+ +
+ Sort Event Log + + + Reset Test + + Click Count: {{ clickCount }} + + +
+
+ {{ log }} +
+
+ + +
+ + No sort events yet. Click on a column header to start testing. + +
+
+
+ +
+ Expected Behavior: +
    +
  • Click 1: ascending (↑)
  • +
  • Click 2: descending (↓)
  • +
  • Click 3: ascending (↑)
  • +
  • Click 4: descending (↓)
  • +
  • And so on...
  • +
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2821/bug2821.component.ts b/apps/prs/angular/src/routes/bugs/2821/bug2821.component.ts new file mode 100644 index 0000000000..59c5299a0e --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2821/bug2821.component.ts @@ -0,0 +1,93 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabTable, + GoabTableSortHeader, + GoabBlock, + GoabText, + GoabButton, +} from "@abgov/angular-components"; +import { GoabTableOnSortDetail } from "@abgov/ui-components-common"; + +interface TableRow { + id: number; + name: string; + age: number; + department: string; +} + +@Component({ + standalone: true, + selector: "abgov-bug2821", + templateUrl: "./bug2821.component.html", + imports: [ + CommonModule, + GoabTable, + GoabTableSortHeader, + GoabBlock, + GoabText, + GoabButton, + ], +}) +export class Bug2821Component { + sortLog: string[] = []; + clickCount = 0; + + // Original data for resetting + originalData: TableRow[] = [ + { id: 1, name: "Alice Johnson", age: 28, department: "Engineering" }, + { id: 2, name: "Bob Smith", age: 32, department: "Marketing" }, + { id: 3, name: "Carol Davis", age: 25, department: "Sales" }, + { id: 4, name: "David Wilson", age: 35, department: "Engineering" }, + { id: 5, name: "Eva Brown", age: 29, department: "HR" }, + ]; + + // Display data that gets sorted + sampleData: TableRow[] = [...this.originalData]; + + handleSort(detail: GoabTableOnSortDetail) { + this.clickCount++; + + const sortDirection = detail.sortDir === 1 ? "ascending" : "descending"; + const logEntry = `Click ${this.clickCount}: Sort by "${detail.sortBy}" - ${sortDirection}`; + + this.sortLog.push(logEntry); + console.log("Sort event:", detail); + + // Sort the data based on the sort event + this.sampleData = [...this.originalData].sort((a, b) => { + let aValue: any = a[detail.sortBy as keyof TableRow]; + let bValue: any = b[detail.sortBy as keyof TableRow]; + + // Handle string comparison + if (typeof aValue === "string" && typeof bValue === "string") { + aValue = aValue.toLowerCase(); + bValue = bValue.toLowerCase(); + } + + // Handle number comparison + if (typeof aValue === "number" && typeof bValue === "number") { + return detail.sortDir === 1 ? aValue - bValue : bValue - aValue; + } + + // Handle string comparison + if (aValue < bValue) { + return detail.sortDir === 1 ? -1 : 1; + } + if (aValue > bValue) { + return detail.sortDir === 1 ? 1 : -1; + } + return 0; + }); + } + + resetTest() { + this.sortLog = []; + this.clickCount = 0; + this.sampleData = [...this.originalData]; + } + + trackByIndex(index: number): number { + return index; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2837/bug2837.component.html b/apps/prs/angular/src/routes/bugs/2837/bug2837.component.html new file mode 100644 index 0000000000..b24d60ed6e --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2837/bug2837.component.html @@ -0,0 +1,81 @@ +
+ + Bug #2837: trailingContent and leadingContent Test + + + + This test demonstrates the issue with trailingContent and leadingContent properties + not working with GoabInputNumber component. All inputs have onChange handlers that log + to console. + + + + GoabInput Tests + + + + + + 1. GoabInput with no additional properties + + + + + + + + + 2. GoabInput with leadingContent and trailingContent + + +
Test
+
+
+
+ + + GoabInputNumber Tests + + + + + + 3. GoabInputNumber with no additional properties + + + + + + + + + 4. GoabInputNumber with leadingContent and trailingContent + + +
Test
+
+
+
+ + + Check the browser console to see the onChange events when you type in the inputs. + +
diff --git a/apps/prs/angular/src/routes/bugs/2837/bug2837.component.ts b/apps/prs/angular/src/routes/bugs/2837/bug2837.component.ts new file mode 100644 index 0000000000..e2744fda9d --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2837/bug2837.component.ts @@ -0,0 +1,25 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabBlock, + GoabText, + GoabInput, + GoabInputNumber, +} from "@abgov/angular-components"; +import { GoabInputOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug2837", + templateUrl: "./bug2837.component.html", + imports: [CommonModule, GoabBlock, GoabText, GoabInput, GoabInputNumber], +}) +export class Bug2837Component { + handleInputChange(detail: GoabInputOnChangeDetail) { + console.log("Input change:", detail); + } + + handleNumberInputChange(detail: GoabInputOnChangeDetail) { + console.log("Number input change:", detail); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2839/bug2839.component.html b/apps/prs/angular/src/routes/bugs/2839/bug2839.component.html new file mode 100644 index 0000000000..60397145ae --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2839/bug2839.component.html @@ -0,0 +1,278 @@ +

Button State Persistence Bug Test (Issue #2839)

+ + + + +

Issue Description

+

+ According to + GitHub issue #2839, buttons stay in the same state after being clicked: +

+
    +
  • + Problem: When you click a button, it changes state as expected, + but the state remains in effect until you click something else +
  • +
  • + Expected: The state should change back as soon as the mouse + button is released +
  • +
  • Reported by: Kevin Yu
  • +
+
+ + + +

Test Instructions

+

+ Click each button below and observe if the button state returns to normal + immediately after releasing the mouse button. The button should not remain in a + "pressed" or "active" state after the click is complete. +

+

Click Count: {{ clickCount }}

+
+ + + +

Test 1: Basic Button Types

+

Test primary, secondary, and tertiary button types:

+ + + + Primary Button + + + + Secondary Button + + + + Tertiary Button + + +
+ + + +

Test 2: Button Sizes

+

Test normal and compact button sizes:

+ + + + Normal Size + + + + Compact Size + + +
+ + + +

Test 3: Button Variants

+

Test normal and destructive button variants:

+ + + + Normal Variant + + + + Destructive Variant + + +
+ + + +

Test 4: Buttons with Icons

+

Test buttons with leading and trailing icons:

+ + + + Leading Icon + + + + Trailing Icon + + + + Both Icons + + +
+ + + +

Test 5: Icon Buttons

+

Test GoabIconButton components:

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

Test 6: Button Groups

+

Test multiple buttons inside GoabButtonGroup:

+ + + + Group Button 1 + + + + Group Button 2 + + + + Group Button 3 + + +
+ + + +

Test 7: Mixed Button Group with Icons

+

Test button group with mixed types and icons:

+ + + + Add Item + + + + Edit + + + + +
+ + + +

Expected vs Actual Behavior

+ +

Expected Behavior (After Fix)

+
    +
  • + Button state should return to normal immediately after mouse button release +
  • +
  • No visual indication of "pressed" or "active" state should persist
  • +
  • Focus state should not interfere with mouse interaction states
  • +
  • All button types and variants should behave consistently
  • +
+
+ + +

Actual Behavior (Before Fix)

+
    +
  • Button state remains in "pressed" or "active" state after click
  • +
  • State only changes when clicking something else
  • +
  • Focus state interferes with mouse interaction
  • +
  • Poor user experience with buttons appearing "stuck"
  • +
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2839/bug2839.component.ts b/apps/prs/angular/src/routes/bugs/2839/bug2839.component.ts new file mode 100644 index 0000000000..9bcc78e2a5 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2839/bug2839.component.ts @@ -0,0 +1,24 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabButton, + GoabIconButton, + GoabButtonGroup, + GoabBlock, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2839", + templateUrl: "./bug2839.component.html", + imports: [CommonModule, GoabButton, GoabIconButton, GoabButtonGroup, GoabBlock], + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class Bug2839Component { + clickCount = 0; + + onButtonClick() { + this.clickCount++; + console.log(`Button clicked ${this.clickCount} times`); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2849/bug2849.component.css b/apps/prs/angular/src/routes/bugs/2849/bug2849.component.css new file mode 100644 index 0000000000..af67c1c1cf --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2849/bug2849.component.css @@ -0,0 +1,7 @@ +/* Bug 2849 Test Component Styles */ +.test-container { + border: 1px solid #ccc; + padding: 1rem; + margin: 1rem 0; + border-radius: 4px; +} \ No newline at end of file diff --git a/apps/prs/angular/src/routes/bugs/2849/bug2849.component.html b/apps/prs/angular/src/routes/bugs/2849/bug2849.component.html new file mode 100644 index 0000000000..3847da9660 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2849/bug2849.component.html @@ -0,0 +1,124 @@ +

Filterable Dropdown Keyboard Selection Bug Test (Issue #2849)

+ + + + +

Issue Description

+

+ According to + GitHub issue #2849, the filterable dropdown has keyboard selection issues: +

+
    +
  • + Shift + End: Should select text from cursor to end, but only + moves cursor +
  • +
  • + Shift + Home: Should select text from cursor to beginning, but + only moves cursor +
  • +
+
+ + + +

Test Instructions

+ +

Test 1: Shift + End

+
    +
  1. Click on the filterable dropdown below
  2. +
  3. Type some text in the filter input (e.g., "test")
  4. +
  5. Place your cursor at the beginning of the text
  6. +
  7. Press Shift + End
  8. +
  9. Expected: Text should be selected from cursor to end
  10. +
  11. Actual: Cursor moves to end but no text is selected
  12. +
+
+ + +

Test 2: Shift + Home

+
    +
  1. Click on the filterable dropdown below
  2. +
  3. Type some text in the filter input (e.g., "test")
  4. +
  5. Place your cursor at the end of the text
  6. +
  7. Press Shift + Home
  8. +
  9. + Expected: Text should be selected from cursor to beginning +
  10. +
  11. + Actual: Cursor moves to beginning but no text is selected +
  12. +
+
+
+ + + +

Test Filterable Dropdown

+

Use this dropdown to test the keyboard selection issues:

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

Selected Value: {{ selectedValue || "None" }}

+
+ + + +

Expected vs Actual Behavior

+ +

Expected Behavior

+
    +
  • + Shift + End should select all text from the cursor position to the end of the + input +
  • +
  • + Shift + Home should select all text from the cursor position to the beginning of + the input +
  • +
  • Selected text should be highlighted/visually indicated
  • +
+
+ + +

Actual Behavior (Bug)

+
    +
  • Shift + End only moves the cursor to the end without selecting text
  • +
  • + Shift + Home only moves the cursor to the beginning without selecting text +
  • +
  • + No text selection occurs, making it impossible to select text using these + keyboard shortcuts +
  • +
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2849/bug2849.component.ts b/apps/prs/angular/src/routes/bugs/2849/bug2849.component.ts new file mode 100644 index 0000000000..2345bde5e9 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2849/bug2849.component.ts @@ -0,0 +1,19 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { GoabDropdown, GoabDropdownItem, GoabBlock } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2849", + templateUrl: "./bug2849.component.html", + styleUrls: ["./bug2849.component.css"], + imports: [CommonModule, GoabDropdown, GoabDropdownItem, GoabBlock], + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class Bug2849Component { + selectedValue = ""; + + onDropdownChange(event: any) { + this.selectedValue = event.value; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2852/bug2852.component.html b/apps/prs/angular/src/routes/bugs/2852/bug2852.component.html new file mode 100644 index 0000000000..b14218dd4e --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2852/bug2852.component.html @@ -0,0 +1,40 @@ + +

Bug #2852: FormItem with Filterable Dropdown Test

+ + + + + + + +
Selected Capital: {{ getSelectedCapitalLabel() }}
+ + + + + + + + + +
diff --git a/apps/prs/angular/src/routes/bugs/2852/bug2852.component.ts b/apps/prs/angular/src/routes/bugs/2852/bug2852.component.ts new file mode 100644 index 0000000000..b1d600508c --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2852/bug2852.component.ts @@ -0,0 +1,85 @@ +import { Component } from "@angular/core"; +import { + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, + GoabInput, +} from "@abgov/angular-components"; +import { GoabDropdownOnChangeDetail } from "@abgov/ui-components-common"; +import { NgFor } from "@angular/common"; + +// US State Capitals +const US_CAPITALS = [ + { value: "montgomery", label: "Montgomery" }, + { value: "juneau", label: "Juneau" }, + { value: "phoenix", label: "Phoenix" }, + { value: "Little Rock" }, + { value: "sacramento", label: "Sacramento" }, + { value: "denver", label: "Denver" }, + { value: "hartford", label: "Hartford" }, + { value: "dover", label: "Dover" }, + { value: "tallahassee", label: "Tallahassee" }, + { value: "atlanta", label: "Atlanta" }, + { value: "honolulu", label: "Honolulu" }, + { value: "boise", label: "Boise" }, + { value: "springfield", label: "Springfield" }, + { value: "indianapolis", label: "Indianapolis" }, + { value: "des-moines" }, + { value: "topeka", label: "Topeka" }, + { value: "frankfort", label: "Frankfort" }, + { value: "baton-rouge", label: "Baton Rouge" }, + { value: "augusta", label: "Augusta" }, + { value: "annapolis", label: "Annapolis" }, + { value: "boston", label: "Boston" }, + { value: "lansing", label: "Lansing" }, + { value: "saint-paul", label: "Saint Paul" }, + { value: "jackson", label: "Jackson" }, + { value: "jefferson-city", label: "Jefferson City" }, + { value: "helena", label: "Helena" }, + { value: "lincoln", label: "Lincoln" }, + { value: "carson-city", label: "Carson City" }, + { value: "concord", label: "Concord" }, + { value: "trenton", label: "Trenton" }, + { value: "santa-fe", label: "Santa Fe" }, + { value: "albany", label: "Albany" }, + { value: "raleigh", label: "Raleigh" }, + { value: "bismarck", label: "Bismarck" }, + { value: "columbus", label: "Columbus" }, + { value: "oklahoma-city", label: "Oklahoma City" }, + { value: "salem", label: "Salem" }, + { value: "harrisburg", label: "Harrisburg" }, + { value: "providence", label: "Providence" }, + { value: "columbia", label: "Columbia" }, + { value: "pierre", label: "Pierre" }, + { value: "nashville", label: "Nashville" }, + { value: "austin", label: "Austin" }, + { value: "salt-lake-city", label: "Salt Lake City" }, + { value: "montpelier", label: "Montpelier" }, + { value: "richmond", label: "Richmond" }, + { value: "olympia", label: "Olympia" }, + { value: "charleston", label: "Charleston" }, + { value: "madison", label: "Madison" }, + { value: "cheyenne", label: "Cheyenne" }, +]; + +@Component({ + selector: "abgov-bug2852", + templateUrl: "./bug2852.component.html", + standalone: true, + imports: [GoabBlock, GoabDropdown, GoabFormItem, GoabDropdownItem, GoabInput, NgFor], +}) +export class Bug2852Component { + selectedCapital: string | number = ""; + usCapitals = US_CAPITALS; + + onChange(detail: GoabDropdownOnChangeDetail) { + console.log("Dropdown changed:", detail); + this.selectedCapital = detail.value || ""; + } + + getSelectedCapitalLabel(): string { + const capital = this.usCapitals.find((c) => c.value === this.selectedCapital); + return capital ? capital.value : "None"; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2873/bug2873.component.html b/apps/prs/angular/src/routes/bugs/2873/bug2873.component.html new file mode 100644 index 0000000000..1a12a6b1d1 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2873/bug2873.component.html @@ -0,0 +1,109 @@ + + Bug 2873 - Drawer scroll and interactive content + + Use the buttons below to open the right and bottom drawers. Each drawer shares the + same long content so scrolling, focus, and interactive elements can be tested + consistently. + + + Expected: When scrolling, keep the Details component and Accordion component near the + bottom or the top. Attempt to click them, they should focus and activate. The bug is + currently that it auto scrolls to them but doesn't activate them. + + + Expected: When using tab navigation, tabbing to the next interactive element in the + Drawer should move the scrolling to that element. + + + + + Open Drawer (Right) + + + Open Drawer (Bottom) + + + + + + + Review notes and long-form content + + This drawer includes extended content to force scrolling beyond two screen heights, + with interactive elements placed throughout for testing. + + + + Paragraph 1: Review the drawer scroll behavior while reading this extended narrative + that stretches across multiple lines and keeps the content dense enough to require + more scrolling. + + + Paragraph 2: Confirm focus handling and keyboard navigation as you move through long + text blocks in the drawer. + + + Paragraph 3: Continue scanning through the content to ensure the drawer retains scroll + position and keeps focus within the panel. + + + Paragraph 4: Validate that the drawer content continues to flow naturally while + maintaining readable spacing and consistent focus order. + + + + + + Use this details panel to verify expandable content within a long drawer. + + + The panel remains interactive while scrolling, and can be toggled while other + content remains visible. + + + + + + Paragraph 5: Final confirmation text to keep the drawer scrolling beyond two full + screens, ensuring the bottom content is reachable and usable. + + + + + + Expand and collapse this accordion to confirm that layout changes do not jump the + scroll position unexpectedly. + + + Keep the content long enough to require scrolling before and after the accordion + section. + + + + + Follow-up inputs + + + + Additional notes + + + + + + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2873/bug2873.component.ts b/apps/prs/angular/src/routes/bugs/2873/bug2873.component.ts new file mode 100644 index 0000000000..0c52b2157d --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2873/bug2873.component.ts @@ -0,0 +1,51 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { + GoabAccordion, + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabDetails, + GoabDrawer, + GoabInput, + GoabText, + GoabTextArea, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2873", + templateUrl: "./bug2873.component.html", + imports: [ + CommonModule, + GoabAccordion, + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabDetails, + GoabDrawer, + GoabInput, + GoabText, + GoabTextArea, + ], +}) +export class Bug2873Component { + rightDrawerOpen = false; + bottomDrawerOpen = false; + + openRightDrawer() { + this.rightDrawerOpen = true; + } + + openBottomDrawer() { + this.bottomDrawerOpen = true; + } + + closeRightDrawer() { + this.rightDrawerOpen = false; + } + + closeBottomDrawer() { + this.bottomDrawerOpen = false; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2878/bug2878.component.html b/apps/prs/angular/src/routes/bugs/2878/bug2878.component.html new file mode 100644 index 0000000000..b6b26db006 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2878/bug2878.component.html @@ -0,0 +1,22 @@ + +

Bug #2878: DatePicker onChange and type="input" Test

+ + + + +
Value: {{ value1 }}
+ + + + +
Value: {{ value2 }}
+
diff --git a/apps/prs/angular/src/routes/bugs/2878/bug2878.component.ts b/apps/prs/angular/src/routes/bugs/2878/bug2878.component.ts new file mode 100644 index 0000000000..b4955d1070 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2878/bug2878.component.ts @@ -0,0 +1,24 @@ +import { Component } from "@angular/core"; +import { GoabBlock, GoabFormItem, GoabDatePicker } from "@abgov/angular-components"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + selector: "abgov-bug2878", + templateUrl: "./bug2878.component.html", + standalone: true, + imports: [GoabBlock, GoabFormItem, GoabDatePicker], +}) +export class Bug2878Component { + value1?: string | Date; + value2?: string | Date; + + onChange1(detail: GoabDatePickerOnChangeDetail) { + console.log("Firing Calendar DatePicker"); + this.value1 = detail.value; + } + + onChange2(detail: GoabDatePickerOnChangeDetail) { + console.log("Firing Input DatePicker"); + this.value2 = detail.value; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2892/bug2892.component.html b/apps/prs/angular/src/routes/bugs/2892/bug2892.component.html new file mode 100644 index 0000000000..4cae2f54ab --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2892/bug2892.component.html @@ -0,0 +1,224 @@ +
+ Bug #2892: Width Measurements Test + + + This test demonstrates various width measurements (ch, px, rem, %) on GoabInput + components. All inputs have onChange handlers that log to console. The bug affects + character width calculations. + + + + Character (ch) Width Tests + + + + + + + + + + + + + + + + + + + + + + + + + Pixel (px) Width Tests + + + + + + + + + + + + + + + + + + + + + + + + + Rem Width Tests + + + + + + + + + + + + + + + + + + + + + + + + + Percentage (%) Width Tests + + + + + + + + + + + + + + + + + + + + + + + + + Default Width Test + + + + + + + + + + Check the browser console to see the onChange events when you type in the inputs. + Notice how character (ch) width inputs behave differently from other units. + +
diff --git a/apps/prs/angular/src/routes/bugs/2892/bug2892.component.ts b/apps/prs/angular/src/routes/bugs/2892/bug2892.component.ts new file mode 100644 index 0000000000..e4cb5d3c8e --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2892/bug2892.component.ts @@ -0,0 +1,16 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { GoabBlock, GoabText, GoabInput, GoabFormItem } from "@abgov/angular-components"; +import { GoabInputOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug2892", + templateUrl: "./bug2892.component.html", + imports: [CommonModule, GoabBlock, GoabText, GoabInput, GoabFormItem], +}) +export class Bug2892Component { + handleInputChange(detail: GoabInputOnChangeDetail) { + console.log("Input change:", detail); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2922/bug2922.component.html b/apps/prs/angular/src/routes/bugs/2922/bug2922.component.html new file mode 100644 index 0000000000..e5a8274aec --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2922/bug2922.component.html @@ -0,0 +1,27 @@ +

Bug #2922: Form Stepper Test

+ +

+ This test demonstrates GoabFormStepper components with 5 GoabFormStep components each. +

+ + +
+

Constrained Width Stepper (500px)

+ + + + + + + +
+ + +

Full Width Stepper

+ + + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2922/bug2922.component.ts b/apps/prs/angular/src/routes/bugs/2922/bug2922.component.ts new file mode 100644 index 0000000000..b174c08305 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2922/bug2922.component.ts @@ -0,0 +1,19 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { GoabFormStepper, GoabFormStep } from "@abgov/angular-components"; +import { GoabFormStepperOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug2922", + templateUrl: "./bug2922.component.html", + imports: [CommonModule, GoabFormStepper, GoabFormStep], +}) +export class Bug2922Component { + currentStep = 1; + + handleStepperChange(detail: GoabFormStepperOnChangeDetail) { + console.log("Form stepper change:", detail); + this.currentStep = detail.step; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2943/bug2943.component.css b/apps/prs/angular/src/routes/bugs/2943/bug2943.component.css new file mode 100644 index 0000000000..fccf268496 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2943/bug2943.component.css @@ -0,0 +1,22 @@ +:host { + display: block; + padding: 24px; +} + +.demo-card { + background: #ffffff; + border: 1px solid #d6d6d6; + border-radius: 12px; + padding: 16px; +} + +.drawer-content { + max-height: 60vh; + overflow-y: auto; +} + +@media (max-width: 640px) { + :host { + padding: 16px; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2943/bug2943.component.html b/apps/prs/angular/src/routes/bugs/2943/bug2943.component.html new file mode 100644 index 0000000000..411d5fe482 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2943/bug2943.component.html @@ -0,0 +1,102 @@ + + bug2943 - Drawer sizing and content interactions + + Use the buttons below to open drawers anchored to the bottom and side. Each drawer + contains enough content to highlight overflow, inputs, and nested actions. + + + + + Bottom drawer scenario + + Opens a medium-height drawer from the bottom with form item content so it reaches + roughly half the viewport. + + Open bottom drawer + + + + + + + + Add steps, notes, or instructions here. The block content encourages scrolling + if the screen height is short. + + + + + + Use this area to capture any additional details needed to reproduce the + experience. The drawer height should adjust while leaving the backdrop + visible. + + + Provide checklist items, validation notes, or follow-up actions to exercise + the space and confirm scroll behaviour when content grows. + + + Finish and close + + + + + + + Side drawer scenario + + Opens from the right and contains multiple sections to force vertical scrolling. + + Open side drawer + + + + + + + + Provide a longer description to ensure the drawer needs to scroll. Each + paragraph adds context for the tester. + + + Additional paragraph to stretch the layout and highlight scroll shadows. + Repeat content with slight variations to mimic real instructions. + + + + + + Checklist: confirm header, close button, and backdrop interactions behave + correctly when scrolling through dense content within the drawer. + + + + + + Final copy block to ensure the drawer consumes the available height and + requires scroll. + + Save changes + + + + + diff --git a/apps/prs/angular/src/routes/bugs/2943/bug2943.component.ts b/apps/prs/angular/src/routes/bugs/2943/bug2943.component.ts new file mode 100644 index 0000000000..f433a975c6 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2943/bug2943.component.ts @@ -0,0 +1,40 @@ +import { Component, signal } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabBlock, + GoabButton, + GoabDrawer, + GoabFormItem, + GoabGrid, + GoabInput, + GoabText, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2943", + templateUrl: "./bug2943.component.html", + styleUrls: ["./bug2943.component.css"], + imports: [ + CommonModule, + GoabBlock, + GoabButton, + GoabDrawer, + GoabFormItem, + GoabGrid, + GoabInput, + GoabText, + ], +}) +export class Bug2943Component { + bottomDrawerOpen = signal(false); + sideDrawerOpen = signal(false); + + toggleBottomDrawer() { + this.bottomDrawerOpen.update((open) => !open); + } + + toggleSideDrawer() { + this.sideDrawerOpen.update((open) => !open); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2948/bug2948.component.html b/apps/prs/angular/src/routes/bugs/2948/bug2948.component.html new file mode 100644 index 0000000000..a777e66877 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2948/bug2948.component.html @@ -0,0 +1,98 @@ +

Bug 2948 - Modal Testing

+

+ Testing different GoabModal configurations with various heading and action patterns. +

+ + +

Modal 1: String Heading

+

+ This modal uses a simple string heading and can be closed with the close button or + backdrop. +

+ Open Modal 1 + +

Modal 2: ng-template Heading and Content

+

+ This modal uses ng-template for both heading and content, allowing for rich HTML + content. +

+ Open Modal 2 + +

Modal 3: Empty Heading and Actions

+

This modal has no heading and no actions, demonstrating minimal configuration.

+ Open Modal 3 + +

Modal 4: ng-template Heading with ButtonGroup Actions

+

+ This modal uses ng-template for heading and contains a ButtonGroup with two buttons in + the actions slot. +

+ Open Modal 4 +
+ + + +

+ This is modal 1 with a simple string heading. It can be closed by clicking the close + button or clicking outside the modal. +

+

The heading is set using the heading property with a string value.

+
+ + + + +
+ Rich Content Modal +
+
+ +
+

Welcome to Modal 2!

+

+ This modal demonstrates using ng-template for both the heading and + content. +

+
    +
  • The heading can contain rich HTML content
  • +
  • You can include icons, formatting, and complex layouts
  • +
  • The content area supports any HTML structure
  • +
+

This provides maximum flexibility for custom modal designs.

+
+
+ + + +

This is modal 3 with an empty heading and no actions.

+

It demonstrates the minimal modal configuration possible.

+

The modal can only be closed using the close button or backdrop click.

+
+ + + +
+

This is modal 4 with a custom heading and action buttons.

+

+ The actions are implemented using a GoabButtonGroup with two buttons. +

+

This pattern is commonly used for confirmation dialogs and form submissions.

+
+ +
+ + Cancel + Confirm + +
+
diff --git a/apps/prs/angular/src/routes/bugs/2948/bug2948.component.ts b/apps/prs/angular/src/routes/bugs/2948/bug2948.component.ts new file mode 100644 index 0000000000..1efb17e290 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2948/bug2948.component.ts @@ -0,0 +1,60 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabModal, + GoabButton, + GoabButtonGroup, + GoabBlock, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug2948", + templateUrl: "./bug2948.component.html", + imports: [CommonModule, GoabModal, GoabButton, GoabButtonGroup, GoabBlock], +}) +export class Bug2948Component { + // Modal 1: String heading + modal1Open = false; + + // Modal 2: ng-template heading and content + modal2Open = false; + + // Modal 3: Empty heading and actions + modal3Open = false; + + // Modal 4: ng-template heading and actions with ButtonGroup + modal4Open = false; + + openModal1() { + this.modal1Open = true; + } + + openModal2() { + this.modal2Open = true; + } + + openModal3() { + this.modal3Open = true; + } + + openModal4() { + this.modal4Open = true; + } + + closeModal1() { + this.modal1Open = false; + } + + closeModal2() { + this.modal2Open = false; + } + + closeModal3() { + this.modal3Open = false; + } + + closeModal4() { + this.modal4Open = false; + } +} diff --git a/apps/prs/angular/src/routes/bugs/2977/bug2977.component.html b/apps/prs/angular/src/routes/bugs/2977/bug2977.component.html new file mode 100644 index 0000000000..0914871549 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2977/bug2977.component.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Testing #2977 Issue + + Tab 1 input should not fire the Tab onChange. Tab 2 and 3 will fire the Tab onChange. + + + + Type here to confirm onChange can stop bubbling. + + + + Type here to see bubbling continue. + + + + Type here to see bubbling continue. + + + diff --git a/apps/prs/angular/src/routes/bugs/2977/bug2977.component.ts b/apps/prs/angular/src/routes/bugs/2977/bug2977.component.ts new file mode 100644 index 0000000000..3820c37534 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2977/bug2977.component.ts @@ -0,0 +1,129 @@ +import { Component } from "@angular/core"; +import { + GoabCheckbox, + GoabCheckboxList, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFileUploadInput, + GoabInput, + GoabRadioGroup, + GoabRadioItem, + GoabTextArea, + GoabFormItem, + GoabTab, + GoabTabs, + GoabText, +} from "@abgov/angular-components"; +import { + GoabCheckboxListOnChangeDetail, + GoabCheckboxOnChangeDetail, + GoabDatePickerOnChangeDetail, + GoabDropdownOnChangeDetail, + GoabFileUploadInputOnSelectFileDetail, + GoabInputOnBlurDetail, + GoabInputOnChangeDetail, + GoabInputOnFocusDetail, + GoabInputOnKeyPressDetail, + GoabRadioGroupOnChangeDetail, + GoabTabsOnChangeDetail, + GoabTextAreaOnBlurDetail, + GoabTextAreaOnChangeDetail, + GoabTextAreaOnKeyPressDetail, +} from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug2977", + templateUrl: "./bug2977.component.html", + imports: [ + GoabCheckbox, + GoabCheckboxList, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFileUploadInput, + GoabInput, + GoabRadioGroup, + GoabRadioItem, + GoabTextArea, + GoabFormItem, + GoabTab, + GoabTabs, + GoabText, + ], +}) +export class Bug2977Component { + logEvent(label: string, detail: unknown) { + console.log(label, detail); + } + + handleInputChange(detail: GoabInputOnChangeDetail) { + this.logEvent("input change", detail); + } + + handleInputFocus(detail: GoabInputOnFocusDetail) { + this.logEvent("input focus", detail); + } + + handleInputBlur(detail: GoabInputOnBlurDetail) { + this.logEvent("input blur", detail); + } + + handleInputKeyPress(detail: GoabInputOnKeyPressDetail) { + this.logEvent("input keypress", detail); + } + + handleCheckboxChange(detail: GoabCheckboxOnChangeDetail) { + this.logEvent("checkbox change", detail); + } + + handleCheckboxListChange(detail: GoabCheckboxListOnChangeDetail) { + this.logEvent("checkbox list change", detail); + } + + handleDatePickerChange(detail: GoabDatePickerOnChangeDetail) { + this.logEvent("date picker change", detail); + } + + handleDropdownChange(detail: GoabDropdownOnChangeDetail) { + this.logEvent("dropdown change", detail); + } + + handleFileSelect(detail: GoabFileUploadInputOnSelectFileDetail) { + this.logEvent("file upload select", detail); + } + + handleRadioGroupChange(detail: GoabRadioGroupOnChangeDetail) { + this.logEvent("radio group change", detail); + } + + handleTextareaChange(detail: GoabTextAreaOnChangeDetail) { + this.logEvent("textarea change", detail); + } + + handleTextareaKeyPress(detail: GoabTextAreaOnKeyPressDetail) { + this.logEvent("textarea keypress", detail); + } + + handleTextareaBlur(detail: GoabTextAreaOnBlurDetail) { + this.logEvent("textarea blur", detail); + } + + handleTabsChange(detail: GoabTabsOnChangeDetail) { + this.logEvent("tabs change", detail); + } + + handleTabInputOne(detail: GoabInputOnChangeDetail) { + detail.event?.stopPropagation(); + this.logEvent("tab 1 input change (stopPropagation)", detail); + } + + handleTabInputTwo(detail: GoabInputOnChangeDetail) { + this.logEvent("tab 2 input change", detail); + } + + handleTabInputThree(detail: GoabInputOnChangeDetail) { + this.logEvent("tab 3 input change", detail); + } +} diff --git a/apps/prs/angular/src/routes/bugs/2991/bug2991.component.css b/apps/prs/angular/src/routes/bugs/2991/bug2991.component.css new file mode 100644 index 0000000000..dde121c8f5 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2991/bug2991.component.css @@ -0,0 +1,41 @@ +.bug2991 { + display: flex; + flex-direction: column; + gap: 32px; + max-width: 720px; +} + +.bug2991__intro { + display: flex; + flex-direction: column; + gap: 8px; +} + +.bug2991__group { + display: flex; + flex-direction: column; + gap: 20px; +} + +.bug2991__group--standalone article { + display: flex; + flex-direction: column; + gap: 8px; +} + +.bug2991__note { + margin: 0; + font-size: 0.875rem; + color: #4a4a4a; +} + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} diff --git a/apps/prs/angular/src/routes/bugs/2991/bug2991.component.html b/apps/prs/angular/src/routes/bugs/2991/bug2991.component.html new file mode 100644 index 0000000000..a6a81c4902 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2991/bug2991.component.html @@ -0,0 +1,75 @@ +
+
+

Bug 2991 — Form item and input coverage

+

+ This manual page lists the combinations requested for bug 2991 so each scenario can + be exercised across Angular and React implementations. +

+
+ +
+
+

Form item requirement states

+ + + + + + +
+ +
+

Help text usage

+ + + +
+ +
+

Error set via onChange

+ + + +
+ +
+

Inputs without form item

+ +
+

ariaLabel property

+ +
+ +
+

ariaLabelledBy property

+ + +
+ +
+

Placeholder only

+ +
+ +
+

No label or placeholder

+ +
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/2991/bug2991.component.ts b/apps/prs/angular/src/routes/bugs/2991/bug2991.component.ts new file mode 100644 index 0000000000..3e74a2b5e9 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/2991/bug2991.component.ts @@ -0,0 +1,20 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { GoabFormItem, GoabInput } from "@abgov/angular-components"; +import { GoabInputOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug2991", + templateUrl: "./bug2991.component.html", + styleUrls: ["./bug2991.component.css"], + imports: [CommonModule, GoabFormItem, GoabInput], +}) +export class Bug2991Component { + validationError?: string; + + onValidatedChange(detail: GoabInputOnChangeDetail) { + const clean = detail.value?.toString().trim() ?? ""; + this.validationError = /^\d{3}$/.test(clean) ? undefined : "Enter a three digit code"; + } +} diff --git a/apps/prs/angular/src/routes/bugs/3072/bug3072.component.css b/apps/prs/angular/src/routes/bugs/3072/bug3072.component.css new file mode 100644 index 0000000000..8281317f1c --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3072/bug3072.component.css @@ -0,0 +1,16 @@ +.bug3072__actions { + margin-top: 24px; + flex-wrap: wrap; +} + +.bug3072__values { + max-width: 720px; +} + +.bug3072__json { + background: #f4f4f4; + border-radius: 4px; + padding: 12px; + overflow-x: auto; + margin-bottom: 16px; +} diff --git a/apps/prs/angular/src/routes/bugs/3072/bug3072.component.html b/apps/prs/angular/src/routes/bugs/3072/bug3072.component.html new file mode 100644 index 0000000000..5e249ed8e0 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3072/bug3072.component.html @@ -0,0 +1,105 @@ +
+ + Bug 3072 – Angular form reset scenario + + Recreates the reactive form described in issue 3072. Populate the fields, reset the + form multiple times, and verify that each GoA input reflects the cleared state. + + +
+ + + + $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Populate sample data + Reset form + +
+ +
+ Form value snapshot +
{{ bugForm.value | json }}
+ valueChanges stream +
{{ valueChanges$ | async | json }}
+
+
+
diff --git a/apps/prs/angular/src/routes/bugs/3072/bug3072.component.ts b/apps/prs/angular/src/routes/bugs/3072/bug3072.component.ts new file mode 100644 index 0000000000..73f6421b8e --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3072/bug3072.component.ts @@ -0,0 +1,88 @@ +import { AsyncPipe, CommonModule } from "@angular/common"; +import { Component, inject } from "@angular/core"; +import { FormBuilder, FormGroup, ReactiveFormsModule } from "@angular/forms"; +import { + GoabBlock, + GoabButton, + GoabCheckbox, + GoabCheckboxList, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, + GoabGrid, + GoabInput, + GoabInputNumber, + GoabText, + GoabTextArea, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3072", + templateUrl: "./bug3072.component.html", + styleUrls: ["./bug3072.component.css"], + imports: [ + CommonModule, + AsyncPipe, + ReactiveFormsModule, + GoabBlock, + GoabButton, + GoabCheckbox, + GoabCheckboxList, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, + GoabGrid, + GoabInput, + GoabInputNumber, + GoabText, + GoabTextArea, + ], +}) +export class Bug3072Component { + private readonly fb = inject(FormBuilder); + + readonly bugForm: FormGroup = this.fb.group({ + lastName: this.fb.control(""), + firstName: this.fb.control(""), + memberId: this.fb.control(null), + genderId: this.fb.control(""), + birthDate: this.fb.control(null), + subscribe: this.fb.control(false), + interests: this.fb.control([]), + notes: this.fb.control(""), + }); + + readonly genders = [ + { value: "1", label: "Male" }, + { value: "2", label: "Female" }, + { value: "3", label: "Other" }, + ]; + + readonly interests = [ + { value: "newsletter", label: "Newsletter" }, + { value: "alerts", label: "Service alerts" }, + { value: "offers", label: "Program offers" }, + ]; + + readonly valueChanges$ = this.bugForm.valueChanges; + + resetForm(): void { + this.bugForm.reset(); + } + + populateSampleData(): void { + this.bugForm.setValue({ + lastName: "Smith", + firstName: "Dana", + memberId: 123456, + genderId: "2", + birthDate: new Date("1990-05-19"), + subscribe: true, + interests: ["newsletter", "alerts"], + notes: "Populated to demonstrate repeated reset behaviour.", + }); + } +} diff --git a/apps/prs/angular/src/routes/bugs/3118/bug3118.component.html b/apps/prs/angular/src/routes/bugs/3118/bug3118.component.html new file mode 100644 index 0000000000..213ed9f8f7 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3118/bug3118.component.html @@ -0,0 +1,196 @@ + + + + 3118 + - MenuButton's width is not setting the correct width on wider elements + + + Use these scenarios to confirm the React wrapper exposes the leading icon property + and that the menu width matches the longest action label. + + + + + + + + Long Elements aren't forced to wrap + + + + + + + + + + + Max width can be set forcing long elements to wrap + + + + + + + + + + + + + + + Components on the right side of the screen will right align the menu options + + + You may may have to resize the browser to test this + + + +
+ + + + + +
+ + + + + + Regression tests + + + + Some text + + + + + + + + + + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dicta earum ipsa ullam + beatae at atque non voluptas fugiat sapiente praesentium quisquam possimus + repellat, illo voluptates nisi obcaecati quos. Mollitia, recusandae. + + + + + + + + + + + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dicta earum ipsa ullam + beatae at atque non voluptas fugiat sapiente praesentium quisquam possimus + repellat, illo voluptates nisi obcaecati quos. Mollitia, recusandae. + + + + + + + + +
diff --git a/apps/prs/angular/src/routes/bugs/3118/bug3118.component.ts b/apps/prs/angular/src/routes/bugs/3118/bug3118.component.ts new file mode 100644 index 0000000000..f8d3ff24d1 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3118/bug3118.component.ts @@ -0,0 +1,31 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { + GoabBlock, + GoabDivider, + GoabMenuAction, + GoabMenuButton, + GoabText, + GoabGrid, +} from "@abgov/angular-components"; +import { GoabMenuButtonOnActionDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-bug3118", + templateUrl: "./bug3118.component.html", + imports: [ + CommonModule, + GoabBlock, + GoabDivider, + GoabMenuAction, + GoabMenuButton, + GoabText, + GoabGrid, + ], +}) +export class Bug3118Component { + protected onAction(detail: GoabMenuButtonOnActionDetail): void { + console.log(detail); + } +} diff --git a/apps/prs/angular/src/routes/bugs/3156/bug3156.component.css b/apps/prs/angular/src/routes/bugs/3156/bug3156.component.css new file mode 100644 index 0000000000..93ab5c3d4f --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3156/bug3156.component.css @@ -0,0 +1,36 @@ +:host { + display: block; +} + +.bug3156 { + max-width: 960px; + margin: 0 auto; +} + +.bug3156__steps { + margin: 0; + padding-left: 1.5rem; + display: grid; + gap: 0.5rem; +} + +.bug3156__diagnostics table { + width: 100%; + border-collapse: collapse; +} + +.bug3156__diagnostics th, +.bug3156__diagnostics td { + border: 1px solid #d0d5dd; + padding: 0.5rem; + text-align: left; +} + +.bug3156__diagnostics th { + background-color: #f2f4f7; +} + +.bug3156__empty { + margin: 0; + font-style: italic; +} diff --git a/apps/prs/angular/src/routes/bugs/3156/bug3156.component.html b/apps/prs/angular/src/routes/bugs/3156/bug3156.component.html new file mode 100644 index 0000000000..8732e0eb6f --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3156/bug3156.component.html @@ -0,0 +1,95 @@ + + Bug 3156 — January disappears in Angular dropdowns + + + The Calendar hotfix relies on every goa-dropdown-item emitting its + dropdown-item:mounted relay with the fully bound label and value. + Removing the defer in DropdownItem causes Angular to emit with empty + strings, so the dropdown never receives January. + + +
+ Reproduction checklist +
    +
  1. Open the dropdown below — with the regression the first entry renders blank.
  2. +
  3. Attempt to pick January — there is nothing to select.
  4. +
  5. Inspect the diagnostics table — the first mount event carries empty data.
  6. +
+
+ + +
+ + + + +
+
+ + + Selected month: {{ selectedMonthLabel }} (value: {{ selectedValue || "None" }}) + + +
+ Calendar DatePicker verification + + The original bug removed January from the DatePicker's month dropdown. Open the + control below and confirm that January now appears and can be selected. With the + regression active, the month list starts at February. + + + + + + + + Last picked date value: {{ calendarValueLabel }} + +
+ +
+ Captured dropdown-item:mounted events + +

+ Open the dropdown above to log the mount events. +

+ + + + + + + + + + + + + + + + + + +
#LabelValueMount type
{{ index + 1 }}{{ item.label }}{{ item.value }}{{ item.mountType }}
+ + + Expected: January appears as row 1 with value "0". Regression: the row reads "(empty)", + so the dropdown never registers January and the Calendar regression remains. + +
+
diff --git a/apps/prs/angular/src/routes/bugs/3156/bug3156.component.ts b/apps/prs/angular/src/routes/bugs/3156/bug3156.component.ts new file mode 100644 index 0000000000..ecfa352c97 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3156/bug3156.component.ts @@ -0,0 +1,133 @@ +import { + AfterViewInit, + Component, + ElementRef, + OnDestroy, + ViewChild, +} from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabBlock, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabDropdownOnChangeDetail, + GoabFormItem, + GoabText, +} from "@abgov/angular-components"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +type DropdownItemLog = { + label: string; + value: string; + mountType: string; +}; + +@Component({ + standalone: true, + selector: "abgov-bug3156", + templateUrl: "./bug3156.component.html", + styleUrls: ["./bug3156.component.css"], + imports: [ + CommonModule, + GoabBlock, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, + GoabText, + ], +}) +export class Bug3156Component implements AfterViewInit, OnDestroy { + readonly months = [ + { label: "January", value: "0" }, + { label: "February", value: "1" }, + { label: "March", value: "2" }, + { label: "April", value: "3" }, + { label: "May", value: "4" }, + { label: "June", value: "5" }, + { label: "July", value: "6" }, + { label: "August", value: "7" }, + { label: "September", value: "8" }, + { label: "October", value: "9" }, + { label: "November", value: "10" }, + { label: "December", value: "11" }, + ]; + + mountedItems: DropdownItemLog[] = []; + selectedValue = ""; + calendarValue?: string | Date; + + @ViewChild("dropdownHost", { static: true }) + dropdownHost?: ElementRef; + + private listenerTarget?: HTMLElement; + + private readonly handleMessage = (event: Event) => { + const customEvent = event as CustomEvent<{ + action: string; + data?: { label?: string; value?: string; mountType?: string }; + }>; + + if (customEvent.detail?.action !== "dropdown-item:mounted") { + return; + } + + const detail = customEvent.detail.data ?? {}; + + this.mountedItems = [ + ...this.mountedItems, + { + label: this.describe(detail.label), + value: this.describe(detail.value), + mountType: this.describe(detail.mountType), + }, + ]; + }; + + ngAfterViewInit(): void { + this.listenerTarget = this.dropdownHost?.nativeElement ?? undefined; + this.listenerTarget?.addEventListener("msg", this.handleMessage as EventListener); + } + + ngOnDestroy(): void { + this.listenerTarget?.removeEventListener("msg", this.handleMessage as EventListener); + } + + onDropdownChange(detail: GoabDropdownOnChangeDetail): void { + this.selectedValue = detail.value ?? ""; + } + + onCalendarChange(detail: GoabDatePickerOnChangeDetail): void { + this.calendarValue = detail.value; + } + + trackByValue(_: number, month: { value: string; label: string }): string { + return month.value; + } + + get selectedMonthLabel(): string { + const match = this.months.find((month) => month.value === this.selectedValue); + return match?.label ?? "None"; + } + + get calendarValueLabel(): string { + if (this.calendarValue instanceof Date) { + return this.calendarValue.toISOString(); + } + + return this.calendarValue ?? "None"; + } + + private describe(value?: string): string { + if (value === undefined) { + return "(missing)"; + } + + if (value === "") { + return "(empty)"; + } + + return value; + } +} diff --git a/apps/prs/angular/src/routes/bugs/3201/bug3201.component.html b/apps/prs/angular/src/routes/bugs/3201/bug3201.component.html new file mode 100644 index 0000000000..24c1a5aef7 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3201/bug3201.component.html @@ -0,0 +1,38 @@ +#3201: Modify GoabInput onChange to not fire on tab +This is to test the GoabInput and GoabTextArea components. Specifically the onChange + event, it should only fire when a change is detected inside the component. It should not + fire when you tab out of the component. +You can see the events fire in the UI for 500ms, or you can check the console + log. + + + +
Change: {{ this.areaChange }} || Blur: {{ this.areaBlur }}
+ + + +
Change: {{ this.inputChange }} || Blur: {{ this.inputBlur }}
+The buttons below will add text to each component. No change event should be + fired. + + Add Input Text + Add + diff --git a/apps/prs/angular/src/routes/bugs/3201/bug3201.component.ts b/apps/prs/angular/src/routes/bugs/3201/bug3201.component.ts new file mode 100644 index 0000000000..d50fe109b0 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3201/bug3201.component.ts @@ -0,0 +1,74 @@ +import { Component } from "@angular/core"; +import { + GoabInput, + GoabText, + GoabTextArea, + GoabFormItem, + GoabButton, + GoabButtonGroup, +} from "@abgov/angular-components"; +import { + GoabInputOnChangeDetail, + GoabInputOnBlurDetail, + GoabTextAreaOnChangeDetail, + GoabTextAreaOnBlurDetail, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3201", + templateUrl: "./bug3201.component.html", + imports: [GoabText, GoabInput, GoabTextArea, GoabFormItem, GoabButton, GoabButtonGroup], +}) +export class Bug3201Component { + inputValue = ""; + textAreaValue = ""; + inputChange = ""; + inputBlur = ""; + areaChange = ""; + areaBlur = ""; + + handleInputChange(detail: GoabInputOnChangeDetail) { + this.inputValue = detail.value; + this.inputChange = "Input Change event fired"; + setTimeout(() => { + this.inputChange = ""; + }, 500); + console.log("Input change event fired"); + } + + handleInputBlur(detail: GoabInputOnBlurDetail) { + this.inputValue = detail.value; + this.inputBlur = "Input Blur event fired"; + setTimeout(() => { + this.inputBlur = ""; + }, 500); + console.log("Input blur event fired"); + } + + handleAreaChange(detail: GoabTextAreaOnChangeDetail) { + this.textAreaValue = detail.value; + this.areaChange = "Text Area Change event fired"; + setTimeout(() => { + this.areaChange = ""; + }, 500); + console.log("Text Area change event fired"); + } + + handleAreaBlur(detail: GoabTextAreaOnBlurDetail) { + this.textAreaValue = detail.value; + this.areaBlur = "Text Area Blur event fired"; + setTimeout(() => { + this.areaBlur = ""; + }, 500); + console.log("Text area blur event fired"); + } + + addInputText() { + this.inputValue = "Different"; + } + + addTextAreaText() { + this.textAreaValue = "This is some new text added to the text area"; + } +} diff --git a/apps/prs/angular/src/routes/bugs/3215/bug3215.component.html b/apps/prs/angular/src/routes/bugs/3215/bug3215.component.html new file mode 100644 index 0000000000..83575d052d --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3215/bug3215.component.html @@ -0,0 +1,81 @@ + + Open Drawer (Right) + Open Drawer (Bottom) + + + + + Cancel + Save + + + + + + Cancel + Save + + + + +

+ Use the buttons below to close this right-positioned drawer. The content area + stretches to fill the available vertical space for layout testing. +

+ Review checklist +
    +
  • Confirm scope alignment
  • +
  • Validate stakeholder sign-offs
  • +
  • Verify accessibility and QA coverage
  • +
+

+ This panel expands to the full viewport height so you can test scrolling and layout + behavior. Add or remove content here to simulate different drawer payloads. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse + lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse + lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse + lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse + lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse + lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +

+
+ + + + + + + + diff --git a/apps/prs/angular/src/routes/bugs/3215/bug3215.component.ts b/apps/prs/angular/src/routes/bugs/3215/bug3215.component.ts new file mode 100644 index 0000000000..d11c756104 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3215/bug3215.component.ts @@ -0,0 +1,35 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { + GoabButton, + GoabButtonGroup, + GoabDrawer, + GoabText, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3215", + templateUrl: "./bug3215.component.html", + imports: [CommonModule, GoabButton, GoabButtonGroup, GoabDrawer, GoabText], +}) +export class Bug3215Component { + rightDrawerOpen = false; + bottomDrawerOpen = false; + + openRightDrawer() { + this.rightDrawerOpen = true; + } + + openBottomDrawer() { + this.bottomDrawerOpen = true; + } + + closeRightDrawer() { + this.rightDrawerOpen = false; + } + + closeBottomDrawer() { + this.bottomDrawerOpen = false; + } +} diff --git a/apps/prs/angular/src/routes/bugs/3248/bug3248.component.html b/apps/prs/angular/src/routes/bugs/3248/bug3248.component.html new file mode 100644 index 0000000000..06ce57a28c --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3248/bug3248.component.html @@ -0,0 +1,61 @@ +
+ Bug #2333: Dropdown Reset Test + + + This test demonstrates the dropdown reset issue. When dropdown items are dynamically removed, + the dropdown should properly sync its internal state to reflect the updated list of options. + + + Test Scenario + + 1. Select a color from the dropdown below + + 2. Click one of the buttons to reduce the number of available options + + + 3. Open the dropdown again - it should only show the remaining options + + + 4. The bug occurred when the filtered options weren't synced after items were destroyed + + + + Currently showing {{ colorsCount }} color(s): {{ colorsList }} + + + + Selected value: {{ selectedColor || "None" }} + + + + @for (color of colors; track color) { + + } + + +
+ + Reduce to 1 item (blue) + + + Reduce to 2 items (green, yellow) + + Reset to all items +
+ + + Expected behavior: After clicking a reduction button, opening the dropdown + should only display the items that remain in the list. + + + Bug behavior (before fix): The dropdown would still show all original items + even after they were removed, because syncFilteredOptions() wasn't called when child items + were destroyed. + +
diff --git a/apps/prs/angular/src/routes/bugs/3248/bug3248.component.ts b/apps/prs/angular/src/routes/bugs/3248/bug3248.component.ts new file mode 100644 index 0000000000..230f85d583 --- /dev/null +++ b/apps/prs/angular/src/routes/bugs/3248/bug3248.component.ts @@ -0,0 +1,45 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabButton, + GoabDropdown, + GoabDropdownItem, + GoabDropdownOnChangeDetail, + GoabText, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-bug3248", + templateUrl: "./bug3248.component.html", + imports: [CommonModule, GoabButton, GoabDropdown, GoabDropdownItem, GoabText], +}) +export class Bug3248Component { + colors = ["red", "blue", "green", "yellow", "purple"]; + selectedColor = ""; + + reduceToOne(): void { + this.colors = ["blue"]; + } + + reduceToTwo(): void { + this.colors = ["green", "yellow"]; + } + + resetToAll(): void { + this.colors = ["red", "blue", "green", "yellow", "purple"]; + } + + onChange(detail: GoabDropdownOnChangeDetail): void { + console.log("Dropdown changed:", detail); + this.selectedColor = Array.isArray(detail.value) ? detail.value[0] : detail.value; + } + + get colorsList(): string { + return this.colors.join(", "); + } + + get colorsCount(): number { + return this.colors.length; + } +} diff --git a/apps/prs/angular/src/routes/features/feat1328/feat1328.component.html b/apps/prs/angular/src/routes/features/feat1328/feat1328.component.html new file mode 100644 index 0000000000..b647867bc1 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1328/feat1328.component.html @@ -0,0 +1,74 @@ +

Feature 1328 Form Demo

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + Show Popover + +

This popover just displays a simple message.

+
+ + + + +
+ + + + + + + {{ + selectedAction + ? "Last action: " + selectedAction + : "Select a menu option to emit an action event." + }} + +
diff --git a/apps/prs/angular/src/routes/features/feat1328/feat1328.component.ts b/apps/prs/angular/src/routes/features/feat1328/feat1328.component.ts new file mode 100644 index 0000000000..acec86592f --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1328/feat1328.component.ts @@ -0,0 +1,78 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabButton, + GoabDropdown, + GoabDropdownItem, + GoabInput, + GoabPopover, + GoabFormItem, + GoabDatePicker, + GoabMenuButton, + GoabMenuAction, + GoabText, +} from "@abgov/angular-components"; +import { + GoabDatePickerOnChangeDetail, + GoabDropdownOnChangeDetail, + GoabInputOnBlurDetail, + GoabInputOnChangeDetail, + GoabMenuButtonOnActionDetail, +} from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-feat1328", + templateUrl: "./feat1328.component.html", + imports: [ + CommonModule, + GoabInput, + GoabDropdown, + GoabDropdownItem, + GoabPopover, + GoabButton, + GoabFormItem, + GoabDatePicker, + GoabMenuButton, + GoabMenuAction, + GoabText, + ], +}) +export class Feat1328Component { + inputValue = ""; + dropdownValue = ""; + selectedAction = ""; + readonly popoverMessage = "This popover just displays a simple message."; + + handleInputChange(detail: GoabInputOnChangeDetail) { + this.inputValue = detail.value || ""; + console.log("Input changed:", this.inputValue); + } + + handleInputBlur(detail: GoabInputOnBlurDetail) { + console.log("Input blurred:", detail.value || ""); + } + + handleDropdownChange(detail: GoabDropdownOnChangeDetail) { + const normalizedValue = + typeof detail.value === "number" ? `${detail.value}` : detail.value || ""; + this.dropdownValue = normalizedValue; + console.log("Dropdown changed:", detail.value); + } + + handleSubmit(event: Event) { + event.preventDefault(); + const form = event.target as HTMLFormElement; + const submission = Object.fromEntries(new FormData(form).entries()); + console.log("Form submitted:", submission); + } + + handleDateChange(detail: GoabDatePickerOnChangeDetail) { + console.log(detail); + console.log(typeof detail.value); + } + + handleAction(detail: GoabMenuButtonOnActionDetail) { + this.selectedAction = detail.action; + } +} diff --git a/apps/prs/angular/src/routes/features/feat1383/feat1383.component.html b/apps/prs/angular/src/routes/features/feat1383/feat1383.component.html new file mode 100644 index 0000000000..4783df57aa --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1383/feat1383.component.html @@ -0,0 +1,164 @@ +
+ 1383: Button: Filled Icons + + + @for (scenario of scenarios; track scenario.id) { + + + {{ scenario.title }} + + + {{ scenario.description }} + + + + + + type: {{ scenario.type }} + + theme property: {{ scenario.theme ? scenario.theme : "(none)" }} + + + + + } + + + Default icons (outline theme) + + @for (icon of iconTypes; track icon.id) { + + + + {{ icon.icon }} + + + } + + + Filled via theme attribute + + @for (icon of iconTypes; track icon.id) { + + + {{ icon.icon }} (theme=filled) + + } + + + Filled via type suffix + + @for (icon of iconTypes; track icon.id) { + + + {{ icon.icon }}:filled + + } + + + GoabBadge iconType property + + + + Badge + + + + + Badge + + + + + + GoabButton leading/trailing icons properties + + + + + accessibility + + + + + accessibility:filled + + + + + GoabIconButton icon property + + + + + + + + + + + GoabInput leading/trailing icon properties + + + + + + + + + + + GoabMenuButton icon property + + + + + + + + + + + + +
diff --git a/apps/prs/angular/src/routes/features/feat1383/feat1383.component.ts b/apps/prs/angular/src/routes/features/feat1383/feat1383.component.ts new file mode 100644 index 0000000000..0b26ff3668 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1383/feat1383.component.ts @@ -0,0 +1,136 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { + GoabBadge, + GoabBlock, + GoabButton, + GoabGrid, + GoabIcon, + GoabIconButton, + GoabInput, + GoabMenuAction, + GoabMenuButton, + GoabText, +} from "@abgov/angular-components"; +import { + GoabIconBaseType, + GoabIconOverridesType, + GoabIconTheme, + GoabIconType, +} from "@abgov/ui-components-common"; + +type IconType = { + id: number; + icon: GoabIconBaseType | GoabIconOverridesType; +}; + +const iconTypes: IconType[] = [ + { id: 1, icon: "accessibility" }, + { id: 2, icon: "backspace" }, + { id: 3, icon: "cafe" }, + { id: 4, icon: "desktop" }, + { id: 5, icon: "ear" }, + { id: 6, icon: "fast-food" }, + { id: 7, icon: "game-controller" }, + { id: 8, icon: "hammer" }, + { id: 9, icon: "ice-cream" }, + { id: 10, icon: "journal" }, + { id: 11, icon: "key" }, + { id: 12, icon: "laptop" }, + { id: 13, icon: "magnet" }, + { id: 14, icon: "navigate-circle" }, + { id: 15, icon: "open" }, + { id: 16, icon: "paper-plane" }, + { id: 17, icon: "qr-code" }, + { id: 18, icon: "radio" }, + { id: 19, icon: "sad" }, + { id: 20, icon: "tablet-landscape" }, + { id: 21, icon: "umbrella" }, + { id: 22, icon: "videocam-off" }, + { id: 23, icon: "walk" }, + { id: 24, icon: "add-circle" }, + { id: 25, icon: "bookmark" }, + { id: 26, icon: "calendar" }, + { id: 27, icon: "documents" }, + { id: 28, icon: "eye-off" }, + { id: 29, icon: "filter" }, + { id: 30, icon: "help-circle" }, + { id: 31, icon: "information-circle" }, + { id: 32, icon: "mail" }, + { id: 33, icon: "notifications" }, + { id: 34, icon: "open" }, + { id: 35, icon: "pencil" }, + { id: 36, icon: "remove" }, + { id: 37, icon: "search" }, + { id: 38, icon: "trash" }, + { id: 39, icon: "warning" }, +]; + +const scenarios: { + id: number; + title: string; + description: string; + type: GoabIconType; + theme?: GoabIconTheme; +}[] = [ + { + id: 1, + title: "New syntax :filled for type", + description: "type uses :filled and no theme property is set.", + type: "accessibility:filled", + }, + { + id: 2, + title: "New syntax :outline for type", + description: "type uses :outline and no theme property is set", + type: "accessibility:outline", + }, + { + id: 3, + title: "Conflicting type and theme", + description: "type uses :filled, theme prop is outline. Type should win.", + type: "accessibility:filled", + theme: "outline", + }, + { + id: 4, + title: "Legacy theme property - filled", + description: "Setting filled via theme property, should still work", + type: "accessibility", + theme: "filled", + }, + { + id: 5, + title: "Default outline", + description: + "No theme property, and no type setting the theme. Default should be outline", + type: "accessibility", + }, +]; + +@Component({ + standalone: true, + selector: "abgov-feat1383", + templateUrl: "./feat1383.component.html", + imports: [ + CommonModule, + GoabText, + GoabGrid, + GoabBlock, + GoabIcon, + GoabBadge, + GoabButton, + GoabIconButton, + GoabInput, + GoabMenuButton, + GoabMenuAction, + ], +}) +export class Feat1383Component { + readonly iconTypes = iconTypes; + readonly scenarios = scenarios; + + filled(icon: IconType): GoabIconType { + return `${icon.icon}:filled` as GoabIconType; + } +} diff --git a/apps/prs/angular/src/routes/features/feat1547/feat1547.component.html b/apps/prs/angular/src/routes/features/feat1547/feat1547.component.html new file mode 100644 index 0000000000..045ba155bd --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1547/feat1547.component.html @@ -0,0 +1,17 @@ +

Feature 1547

+

Feature 1547 implementation

+ + + + + + + +
+

This is a multiline tooltip with bold text.

+

Here's some italic text on a separate line.

+

And here's a link on its own line.

+
+ +
+
diff --git a/apps/prs/angular/src/routes/features/feat1547/feat1547.component.ts b/apps/prs/angular/src/routes/features/feat1547/feat1547.component.ts new file mode 100644 index 0000000000..162c662d48 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1547/feat1547.component.ts @@ -0,0 +1,11 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { GoabTooltip, GoabIcon, GoabBlock } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat1547", + templateUrl: "./feat1547.component.html", + imports: [CommonModule, GoabTooltip, GoabIcon, GoabBlock], +}) +export class Feat1547Component {} diff --git a/apps/prs/angular/src/routes/features/feat1813/feat1813.component.css b/apps/prs/angular/src/routes/features/feat1813/feat1813.component.css new file mode 100644 index 0000000000..0d34a06cab --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1813/feat1813.component.css @@ -0,0 +1,24 @@ +.scenario-wrapper { + min-width: 0; +} + +goab-block.scenario-card { + border: 1px solid #d8d8d8; + border-radius: 8px; + padding: 16px; + background: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + min-width: 0; +} + +goab-block.scenario-card goab-form-item { + margin-top: 8px; +} + +.measurement { + color: #505050; +} + +.scenario-emphasis { + font-weight: 600; +} diff --git a/apps/prs/angular/src/routes/features/feat1813/feat1813.component.html b/apps/prs/angular/src/routes/features/feat1813/feat1813.component.html new file mode 100644 index 0000000000..77f989db9b --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1813/feat1813.component.html @@ -0,0 +1,102 @@ + + Date Picker width verification + + Demonstrates the new width input and confirms the minimum readable size + matches our other text-based controls. + + + +
+ + {{ scenario.label }} + {{ scenario.description }} + + {{ scenario.emphasis }} + + + + + + + + Host width: + {{ + measurements[scenario.id].hostWidth !== undefined + ? measurements[scenario.id].hostWidth + "px" + : "–" + }} + · Input width: + {{ + measurements[scenario.id].inputWidth !== undefined + ? measurements[scenario.id].inputWidth + "px" + : "–" + }} + + + Input width attribute: + {{ + measurements[scenario.id].widthAttr !== undefined + ? measurements[scenario.id].widthAttr || "none" + : "–" + }} + + +
+
+ + + Popover sanity check + + + Open popover + +

Popover content should size itself to the calendar content.

+
+
+ +
+ + + + + + + + + + + + +
+ + + Latest interactions + + Last selected date: {{ lastSelectedDate || "None selected" }} + + + Last selected dropdown: {{ lastSelectedDropdown || "None selected" }} + + +
diff --git a/apps/prs/angular/src/routes/features/feat1813/feat1813.component.ts b/apps/prs/angular/src/routes/features/feat1813/feat1813.component.ts new file mode 100644 index 0000000000..7c42ddb182 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1813/feat1813.component.ts @@ -0,0 +1,195 @@ +import { + AfterViewInit, + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, +} from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabDatePicker, + GoabDatePickerOnChangeDetail, + GoabPopover, + GoabButton, + GoabFormItem, + GoabDropdown, + GoabDropdownItem, + GoabText, + GoabBlock, +} from "@abgov/angular-components"; +import { FormControl, FormGroup, ReactiveFormsModule, FormsModule } from "@angular/forms"; + +interface DatePickerScenario { + id: string; + label: string; + width?: string; + containerWidth?: string; + type?: "calendar" | "input"; + description: string; + emphasis?: string; +} + +interface ScenarioMeasurement { + hostWidth?: number; + inputWidth?: number; + widthAttr?: string | null; +} + +@Component({ + standalone: true, + selector: "abgov-feat1813", + templateUrl: "./feat1813.component.html", + styleUrls: ["./feat1813.component.css"], + imports: [ + CommonModule, + GoabDatePicker, + GoabPopover, + GoabButton, + GoabFormItem, + GoabDropdown, + GoabDropdownItem, + GoabText, + ReactiveFormsModule, + FormsModule, + GoabBlock, + ], +}) +export class Feat1813Component implements OnInit, AfterViewInit, OnDestroy { + lastSelectedDate = ""; + lastSelectedDropdown: string | null = "red"; + dropdownGroup = new FormGroup({ + dropdownCtrl: new FormControl("red"), + }); + measurements: Record = {}; + + readonly scenarios: DatePickerScenario[] = [ + { + id: "default", + label: "Default (no width provided)", + description: "Should fall back to the shared default 16ch width like GoA inputs.", + }, + { + id: "ch-24", + label: "Character width (24ch)", + width: "24ch", + description: + "Ensures ch units are preserved and forwarded to the underlying GoA input.", + }, + { + id: "px-360", + label: "Fixed width (360px)", + width: "360px", + description: "Checks pixel widths and ensures popover content fits target.", + }, + { + id: "percent-80", + label: "Relative width (80% inside 560px container)", + width: "80%", + containerWidth: "560px", + description: "Validates percentage widths respect the parent container.", + }, + { + id: "clamp-small", + label: "Requested width below minimum (8ch in a 120px slot)", + width: "8ch", + containerWidth: "120px", + description: + "Should not shrink below the minimum readable width; expect ≥ 16ch (~160px).", + emphasis: "Must stay readable", + }, + { + id: "input-segments", + label: "Type “input” with explicit width (340px)", + width: "340px", + type: "input", + description: + "Ensures segmented date input respects width and keeps month/day/year layout aligned.", + }, + ]; + + private resizeHandler = () => this.scheduleMeasurement(); + + constructor(private readonly cdr: ChangeDetectorRef) {} + + onDateChange(details: GoabDatePickerOnChangeDetail) { + console.log("Date changed:", details); + this.lastSelectedDate = details.value + ? new Date(details.value).toLocaleDateString() + : "None"; + } + + ngOnInit() { + this.dropdownGroup.controls["dropdownCtrl"].valueChanges.subscribe((value) => { + if (!value) { + console.log("Value empty"); + this.dropdownGroup.controls["dropdownCtrl"].setValue(this.lastSelectedDropdown); + } else { + console.log("Value changed: ", value); + this.lastSelectedDropdown = value; + } + }); + } + + ngAfterViewInit(): void { + this.scheduleMeasurement(); + window.addEventListener("resize", this.resizeHandler, { passive: true }); + } + + ngOnDestroy(): void { + window.removeEventListener("resize", this.resizeHandler); + } + + trackByScenarioId(_: number, scenario: DatePickerScenario): string { + return scenario.id; + } + + private scheduleMeasurement(): void { + requestAnimationFrame(() => { + setTimeout(() => { + this.measurements = this.collectMeasurements(); + this.cdr.markForCheck(); + }, 0); + }); + } + + private collectMeasurements(): Record { + const readings: Record = {}; + + for (const scenario of this.scenarios) { + const wrapper = document.querySelector( + `[data-scenario="${scenario.id}"]`, + ); + + const host = wrapper?.querySelector("goa-date-picker") ?? undefined; + + const hostWidth = host?.getBoundingClientRect().width; + + const popover = host?.shadowRoot?.querySelector("goa-popover"); + const goaInput = popover?.querySelector("goa-input"); + const widthAttr = goaInput?.getAttribute("width") ?? null; + const inputElement = + goaInput?.shadowRoot?.querySelector("input") ?? goaInput; + const inputWidth = inputElement?.getBoundingClientRect().width; + + if (scenario.type === "input" && !goaInput) { + const formItem = host?.shadowRoot?.querySelector("goa-form-item"); + readings[scenario.id] = { + hostWidth: hostWidth ? Math.round(hostWidth) : undefined, + inputWidth: formItem + ? Math.round(formItem.getBoundingClientRect().width) + : undefined, + widthAttr, + }; + continue; + } + + readings[scenario.id] = { + hostWidth: hostWidth ? Math.round(hostWidth) : undefined, + inputWidth: inputWidth ? Math.round(inputWidth) : undefined, + widthAttr, + }; + } + + return readings; + } +} diff --git a/apps/prs/angular/src/routes/features/feat1908/feat1908.component.ts b/apps/prs/angular/src/routes/features/feat1908/feat1908.component.ts new file mode 100644 index 0000000000..21b9a3d7a4 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat1908/feat1908.component.ts @@ -0,0 +1,167 @@ +import { Component, OnInit, OnDestroy } from "@angular/core"; +import { + GoabButton, + GoabCheckbox, + GoabCheckboxOnChangeDetail, + GoabLinearProgress, +} from "@abgov/angular-components"; + +@Component({ + selector: "abgov-app-linear-progress-test", + standalone: true, + imports: [GoabLinearProgress, GoabButton, GoabCheckbox], + template: ` +
+

Linear Progress Examples

+
+

Indeterminate Progress

+ +
+
+

Indeterminate Progress - no percentage

+ +
+
+

Determinate Progress - 0%

+ +
+
+

Determinate Progress - 25%

+ +
+
+

Determinate Progress - 50%

+ +
+
+

Determinate Progress - 75%

+ +
+
+

Determinate Progress - 100%

+ +
+
+

Dynamic Progress

+ +
+ -10% + +10% + Zero + Indeterminate + +
+
+
+

Updating Determinate Progress - 0% ➡️ 100%

+ +
+
+ `, + styles: [ + ` + .linear-progress-examples { + padding: 2rem; + max-width: 800px; + } + section { + margin-bottom: 2rem; + } + h3 { + margin-bottom: 1rem; + } + .controls { + margin-top: 1rem; + display: flex; + gap: 0.5rem; + } + button { + padding: 0.5rem 1rem; + cursor: pointer; + } + `, + ], +}) +export class Feat1908Component implements OnInit, OnDestroy { + dynamicProgress: number | null | undefined = null; + autoProgress = 0; + nullProgressValue: number | null | undefined = undefined; + showPercentage = true; + percentVisibility: "visible" | "hidden" | undefined = "visible"; + + private intervalId: any; + + increaseProgress(): void { + if ( + this.dynamicProgress === null || + this.dynamicProgress === undefined || + this.dynamicProgress >= 100 + ) { + this.dynamicProgress = 0; + return; + } + + this.dynamicProgress = Math.min(100, this.dynamicProgress + 10); + } + + decreaseProgress(): void { + if ( + this.dynamicProgress === null || + this.dynamicProgress === undefined || + this.dynamicProgress <= 0 + ) { + this.dynamicProgress = 100; + return; + } + + this.dynamicProgress = Math.max(0, this.dynamicProgress - 10); + } + + resetProgress(): void { + this.dynamicProgress = 0; + } + + indeterminateProgress(): void { + this.dynamicProgress = undefined; + } + + onShowPercentageChange(event: GoabCheckboxOnChangeDetail): void { + if (event.checked !== undefined) { + this.showPercentage = event.checked; + this.percentVisibility = this.showPercentage ? "visible" : "hidden"; + } + } + + ngOnInit() { + this.intervalId = setInterval(() => { + this.autoProgress += 0.25; + if (this.autoProgress > 100) { + this.autoProgress = 0; + } + }, 100); + } + + ngOnDestroy() { + if (this.intervalId) { + clearInterval(this.intervalId); + } + } +} diff --git a/apps/prs/angular/src/routes/features/feat2054/feat2054.component.css b/apps/prs/angular/src/routes/features/feat2054/feat2054.component.css new file mode 100644 index 0000000000..804c96e20e --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2054/feat2054.component.css @@ -0,0 +1,30 @@ +:host { + display: block; + padding: 24px; +} + +.demo-card { + background: #ffffff; + border: 1px solid #d6d6d6; + border-radius: 12px; + padding: 16px; +} + +.tooltip-wrapper { + width: 800px; +} + +.tooltip-trigger { + display: inline-block; + font-weight: 600; +} + +@media (max-width: 640px) { + :host { + padding: 16px; + } + + .tooltip-wrapper { + width: 100%; + } +} diff --git a/apps/prs/angular/src/routes/features/feat2054/feat2054.component.html b/apps/prs/angular/src/routes/features/feat2054/feat2054.component.html new file mode 100644 index 0000000000..296546bde5 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2054/feat2054.component.html @@ -0,0 +1,84 @@ + + + Feature 2054 - maxWidth comparison showcase + + Each example keeps content identical and only varies the maxWidth value + so you can compare how dropdowns, text areas, and tooltips respond at three distinct + sizes. + + + + + {{ tooltipContent }} + + + + Dropdown examples + + + {{ example.label }} + + maxWidth set to {{ example.maxWidth }} while width remains at 800px. Item labels + share the same text to highlight truncation and wrapping. + + + + + + + + + + Textarea examples + + + {{ example.label }} + + The textarea width is fixed at 800px to match the dropdowns, allowing the + maxWidth value alone to dictate the rendered width. + + + + + + + Tooltip examples +
+ {{ example.label }} + + Tooltip content mirrors the textarea copy so the surface width shifts solely from + the maxWidth setting. + + + Hover to compare maxWidth behaviour + + {{ tooltipContent }} + + +
+
diff --git a/apps/prs/angular/src/routes/features/feat2054/feat2054.component.ts b/apps/prs/angular/src/routes/features/feat2054/feat2054.component.ts new file mode 100644 index 0000000000..75e96f08d6 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2054/feat2054.component.ts @@ -0,0 +1,64 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabText, + GoabTextArea, + GoabTooltip, +} from "@abgov/angular-components"; + +interface MaxWidthExample { + readonly label: string; + readonly maxWidth: string; +} + +@Component({ + standalone: true, + selector: "abgov-feat2054", + templateUrl: "./feat2054.component.html", + styleUrls: ["./feat2054.component.css"], + imports: [ + CommonModule, + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabText, + GoabTextArea, + GoabTooltip, + ], +}) +export class Feat2054Component { + readonly examples: MaxWidthExample[] = [ + { label: "maxWidth 200px", maxWidth: "200px" }, + { label: "maxWidth 60ch", maxWidth: "60ch" }, + { label: "maxWidth 50%", maxWidth: "50%" }, + ]; + + readonly dropdownItems = [ + { + label: + "Comprehensive option label designed to span the full 800px width when maxWidth allows", + value: "full-width-option", + }, + { + label: "Secondary descriptive choice reinforcing measurement comparisons", + value: "secondary-choice", + }, + { + label: "Additional entry mirroring content for consistent evaluations", + value: "tertiary-choice", + }, + ]; + + readonly textareaValue = + "This textarea content intentionally stretches across the full 800px width so the maxWidth attribute" + + " clearly demonstrates how the component constrains layout. Each example reuses the same text" + + " to make comparisons straightforward."; + + readonly tooltipContent = + "This tooltip description mirrors the other component content. It is lengthy enough to occupy" + + " the full 800px width where permitted, making changes in maxWidth easy to compare across" + + " scenarios."; +} diff --git a/apps/prs/angular/src/routes/features/feat2267/feat2267.component.html b/apps/prs/angular/src/routes/features/feat2267/feat2267.component.html new file mode 100644 index 0000000000..409b08bb5f --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2267/feat2267.component.html @@ -0,0 +1,205 @@ +
+ Checkbox Testing + + + + + + + + + + + +

Selected Value: {{ form.get("checkboxItem")?.value }}

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

Basic Selection: {{ basicSelection }}

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

Error Selection: {{ errorSelection }}

+
+ + + + + + + + +

Basic Selection: {{ basicSelection }}

+
+ + + + + + + +

Selected: {{ manualContactPreferences }}

+
+
diff --git a/apps/prs/angular/src/routes/features/feat2267/feat2267.component.ts b/apps/prs/angular/src/routes/features/feat2267/feat2267.component.ts new file mode 100644 index 0000000000..a58be56693 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2267/feat2267.component.ts @@ -0,0 +1,90 @@ +import { Component } from "@angular/core"; +import { + GoabFormItem, + GoabCheckbox, + GoabCheckboxList, + GoabText, + GoabInput, + GoabCheckboxListOnChangeDetail, + GoabCheckboxOnChangeDetail, +} from "@abgov/angular-components"; +import { ReactiveFormsModule, FormsModule, FormGroup, FormBuilder } from "@angular/forms"; + +@Component({ + standalone: true, + selector: "abgov-feat1547", + templateUrl: "./feat2267.component.html", + imports: [ + GoabFormItem, + GoabCheckbox, + GoabCheckboxList, + GoabText, + GoabInput, + ReactiveFormsModule, + FormsModule, + ], +}) +export class Feat2267Component { + form!: FormGroup; + constructor(private fb: FormBuilder) { + this.form = this.fb.group({ + checkboxItem: [""], + }); + } + private readonly manualContactOptions = ["email", "phone", "sms"]; + basicSelection: string[] = []; + errorSelection: string[] = []; + checkboxListError = ""; + checkboxListHasError = false; + manualContactPreferences: string[] = []; + + checkboxOnChange(details: GoabCheckboxOnChangeDetail) { + console.log(details.value); + } + + checkboxFormControlOnChange() { + console.log(this.form.get("checkboxItem")?.value); + } + + inputOnChange() { + console.log("Input changed"); + } + + checkboxListBasicOnChange(details: GoabCheckboxListOnChangeDetail) { + console.log(details); + this.basicSelection = details.value; + } + + checkboxListErrorOnChange(details: GoabCheckboxListOnChangeDetail) { + console.log(details); + this.errorSelection = details.value; + if (this.errorSelection.includes("error4")) { + this.checkboxListHasError = true; + this.checkboxListError = "This is an error"; + } else { + this.checkboxListHasError = false; + this.checkboxListError = ""; + } + } + + get manualAllChecked(): boolean { + return this.manualContactPreferences.length === this.manualContactOptions.length; + } + + get manualAllIndeterminate(): boolean { + const len = this.manualContactPreferences.length; + return len > 0 && len < this.manualContactOptions.length; + } + + toggleManualAll() { + if (this.manualAllChecked) { + this.manualContactPreferences = []; + } else { + this.manualContactPreferences = [...this.manualContactOptions]; + } + } + + onManualContactPreferencesChange(event: GoabCheckboxListOnChangeDetail) { + this.manualContactPreferences = event.value; + } +} diff --git a/apps/prs/angular/src/routes/features/feat2328/feat2328.component.html b/apps/prs/angular/src/routes/features/feat2328/feat2328.component.html new file mode 100644 index 0000000000..0f48566388 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2328/feat2328.component.html @@ -0,0 +1,110 @@ +Container height scenarios + + No maxHeight or minHeight + + +

Basic simple text to extend to 400px width

+
+ +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare velit. + Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. Vestibulum ante + ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed ornare + odio odio, quis iaculis mi ultricies a. Sed vehicula, ante sit amet porttitor + sollicitudin, arcu mi pharetra enim, aliquam posuere sapien odio in nisi. + Curabitur congue odio quam, a fringilla metus ullamcorper vel. Nulla magna urna, + ultrices eu nibh ac, dictum pulvinar justo. Nam porta massa pulvinar, congue + turpis eget, finibus nulla. Suspendisse potenti. Class aptent taciti sociosqu ad + litora torquent per conubia nostra, per inceptos himenaeos. Cras quis risus + libero. +

+
+
+ minHeight 300px or equivalent + + +

Basic simple text to extend to 400px width

+
+ +

31ch

+

Basic simple text to extend to 400px width

+
+ +

19rem

+

Basic simple text to extend to 400px width

+
+
+ maxHeight 300px or equivalent + + +

Basic simple text to extend to 400px width

+
+ +

31ch

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare velit. + Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. Vestibulum ante + ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed ornare + odio odio, quis iaculis mi ultricies a. Sed vehicula, ante sit amet porttitor + sollicitudin, arcu mi pharetra enim, aliquam posuere sapien odio in nisi. + Curabitur congue odio quam, a fringilla metus ullamcorper vel. Nulla magna urna, + ultrices eu nibh ac, dictum pulvinar justo. Nam porta massa pulvinar, congue + turpis eget, finibus nulla. Suspendisse potenti. Class aptent taciti sociosqu ad + litora torquent per conubia nostra, per inceptos himenaeos. Cras quis risus + libero. +

+
+ +

19rem

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare velit. + Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. Vestibulum ante + ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed ornare + odio odio, quis iaculis mi ultricies a. Sed vehicula, ante sit amet porttitor + sollicitudin, arcu mi pharetra enim, aliquam posuere sapien odio in nisi. + Curabitur congue odio quam, a fringilla metus ullamcorper vel. Nulla magna urna, + ultrices eu nibh ac, dictum pulvinar justo. Nam porta massa pulvinar, congue + turpis eget, finibus nulla. Suspendisse potenti. Class aptent taciti sociosqu ad + litora torquent per conubia nostra, per inceptos himenaeos. Cras quis risus + libero. +

+
+
+ + minHeight 300px and maxHeight 400px or equivalent + + +

Basic simple text to extend to 400px width

+
+ +

31ch and 41ch

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare velit. + Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. Vestibulum ante + ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed ornare + odio odio, quis iaculis mi ultricies a. Sed vehicula, ante sit amet porttitor + sollicitudin, arcu mi pharetra enim, aliquam posuere sapien odio in nisi. + Curabitur congue odio quam, a fringilla metus ullamcorper vel. Nulla magna urna, + ultrices eu nibh ac, dictum pulvinar justo. Nam porta massa pulvinar, congue + turpis eget, finibus nulla. Suspendisse potenti. Class aptent taciti sociosqu ad + litora torquent per conubia nostra, per inceptos himenaeos. Cras quis risus + libero. +

+
+ +

19rem and 25rem

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare velit. + Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. Vestibulum ante + ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed ornare + odio odio, quis iaculis mi ultricies a. Sed vehicula, ante sit amet porttitor + sollicitudin, arcu mi pharetra enim, aliquam posuere sapien odio in nisi. + Curabitur congue odio quam, a fringilla metus ullamcorper vel. Nulla magna urna, + ultrices eu nibh ac, dictum pulvinar justo. Nam porta massa pulvinar, congue + turpis eget, finibus nulla. Suspendisse potenti. Class aptent taciti sociosqu ad + litora torquent per conubia nostra, per inceptos himenaeos. Cras quis risus + libero. +

+
+
+
diff --git a/apps/prs/angular/src/routes/features/feat2328/feat2328.component.ts b/apps/prs/angular/src/routes/features/feat2328/feat2328.component.ts new file mode 100644 index 0000000000..ab5e36e888 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2328/feat2328.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { GoabContainer, GoabText, GoabBlock } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat2328", + templateUrl: "./feat2328.component.html", + imports: [GoabText, GoabBlock, GoabContainer], +}) +export class Feat2328Component {} diff --git a/apps/prs/angular/src/routes/features/feat2361/feat2361.component.css b/apps/prs/angular/src/routes/features/feat2361/feat2361.component.css new file mode 100644 index 0000000000..3f5393403d --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2361/feat2361.component.css @@ -0,0 +1,11 @@ +.feat2361__actions { + display: flex; + gap: 12px; + flex-wrap: wrap; +} + +.feat2361__checkboxes { + display: flex; + flex-direction: column; + gap: 8px; +} diff --git a/apps/prs/angular/src/routes/features/feat2361/feat2361.component.html b/apps/prs/angular/src/routes/features/feat2361/feat2361.component.html new file mode 100644 index 0000000000..b2b3e6600f --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2361/feat2361.component.html @@ -0,0 +1,105 @@ +
+ + Feature 2361 - Selection control toggles + + Manual scenarios to verify the expanded clickable area on radio and checkbox controls while sharing error and disabled toggles. + + +
+ + {{ errorActive ? "Clear error state" : "Enable error state" }} + + + {{ disabledActive ? "Enable controls" : "Disable controls" }} + +
+ + + Error state: {{ errorActive ? "on" : "off" }} | Disabled: {{ disabledActive ? "on" : "off" }} + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
diff --git a/apps/prs/angular/src/routes/features/feat2361/feat2361.component.ts b/apps/prs/angular/src/routes/features/feat2361/feat2361.component.ts new file mode 100644 index 0000000000..1ee9c818a2 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2361/feat2361.component.ts @@ -0,0 +1,72 @@ +import { CommonModule, NgFor } from "@angular/common"; +import { Component } from "@angular/core"; +import { + GoabBlock, + GoabButton, + GoabCheckbox, + GoabCheckboxList, + GoabFormItem, + GoabGrid, + GoabRadioGroup, + GoabRadioItem, + GoabText, +} from "@abgov/angular-components"; + +type SelectionOption = { value: string; label: string }; + +@Component({ + standalone: true, + selector: "abgov-feat2361", + templateUrl: "./feat2361.component.html", + styleUrls: ["./feat2361.component.css"], + imports: [ + CommonModule, + NgFor, + GoabBlock, + GoabButton, + GoabCheckbox, + GoabCheckboxList, + GoabFormItem, + GoabGrid, + GoabRadioGroup, + GoabRadioItem, + GoabText, + ], +}) +export class Feat2361Component { + protected readonly horizontalOptions: SelectionOption[] = [ + { value: "sunrise", label: "Sunrise" }, + { value: "noon", label: "High noon" }, + { value: "sunset", label: "Sunset" }, + ]; + + protected readonly verticalOptions: SelectionOption[] = [ + { value: "maple", label: "Maple" }, + { value: "spruce", label: "Spruce" }, + { value: "birch", label: "Birch" }, + ]; + + protected readonly checkboxListOptions: SelectionOption[] = [ + { value: "analytics", label: "Analytics reports" }, + { value: "alerts", label: "Incident alerts" }, + { value: "news", label: "Program news" }, + ]; + + protected readonly checkboxOptions: SelectionOption[] = [ + { value: "alpha", label: "Enable alpha feature" }, + { value: "beta", label: "Enable beta feature" }, + { value: "gamma", label: "Enable gamma feature" }, + ]; + + protected errorActive = false; + protected disabledActive = false; + protected readonly errorMessage = "Example error message for feature 2361"; + + protected toggleError(): void { + this.errorActive = !this.errorActive; + } + + protected toggleDisabled(): void { + this.disabledActive = !this.disabledActive; + } +} diff --git a/apps/prs/angular/src/routes/features/feat2440/feat2440.component.html b/apps/prs/angular/src/routes/features/feat2440/feat2440.component.html new file mode 100644 index 0000000000..c78dace36b --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2440/feat2440.component.html @@ -0,0 +1,10 @@ + + This element should have the id "blankID" and be the default with no tag. + + + This element should have the id "headingID" and have an "h1" tag. + + + This element should have the id "paragraphID" and have a "p" tag with a size of + "heading-m" + diff --git a/apps/prs/angular/src/routes/features/feat2440/feat2440.component.ts b/apps/prs/angular/src/routes/features/feat2440/feat2440.component.ts new file mode 100644 index 0000000000..cf5b5afc05 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2440/feat2440.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { GoabText } from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat2440", + templateUrl: "./feat2440.component.html", + imports: [GoabText], +}) +export class Feat2440Component {} diff --git a/apps/prs/angular/src/routes/features/feat2492/feat2492.component.css b/apps/prs/angular/src/routes/features/feat2492/feat2492.component.css new file mode 100644 index 0000000000..c68dd3a058 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2492/feat2492.component.css @@ -0,0 +1,28 @@ +:host { + display: block; + padding: 24px; +} + +.result-panel { + border: 1px solid #d6d6d6; + border-radius: 12px; + padding: 16px; + background: #f8f8f8; +} + +.event-log { + border: 1px solid #d6d6d6; + border-radius: 12px; + padding: 16px; + background: #ffffff; +} + +.event-log__heading { + font-weight: 600; +} + +@media (max-width: 640px) { + :host { + padding: 16px; + } +} diff --git a/apps/prs/angular/src/routes/features/feat2492/feat2492.component.html b/apps/prs/angular/src/routes/features/feat2492/feat2492.component.html new file mode 100644 index 0000000000..64481a56bd --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2492/feat2492.component.html @@ -0,0 +1,65 @@ + + + Feature 2492 - textarea blur preview + + Enter text, move focus away, and confirm the onBlur event emits the textarea value for display below. + + + + + + Interactive example + + + + + + + + + + Captured blur details + + Blur count: {{ blurCount }} + Last value: {{ lastBlurValue || '(empty text)' }} + + + Blur the textarea to capture and render its value. + + + + + Event log + Change events + + + Change {{ index + 1 }}: {{ entry.value || '(empty text)' }} + + + + No onChange events captured yet. + + + Key press events + + + Key {{ index + 1 }}: {{ entry.key }} value: {{ entry.value || '(empty text)' }} + + + + No onKeyPress events captured yet. + + + + + diff --git a/apps/prs/angular/src/routes/features/feat2492/feat2492.component.ts b/apps/prs/angular/src/routes/features/feat2492/feat2492.component.ts new file mode 100644 index 0000000000..ef11696a66 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2492/feat2492.component.ts @@ -0,0 +1,48 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabBlock, + GoabFormItem, + GoabGrid, + GoabInput, + GoabText, + GoabTextArea, +} from "@abgov/angular-components"; +import { GoabTextAreaOnBlurDetail, GoabTextAreaOnChangeDetail, GoabTextAreaOnKeyPressDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-feat2492", + templateUrl: "./feat2492.component.html", + styleUrls: ["./feat2492.component.css"], + imports: [ + CommonModule, + GoabBlock, + GoabFormItem, + GoabGrid, + GoabInput, + GoabText, + GoabTextArea, + ], +}) +export class Feat2492Component { + lastBlurValue = ""; + blurCount = 0; + textareaValue = ""; + changeLog: GoabTextAreaOnChangeDetail[] = []; + keyPressLog: GoabTextAreaOnKeyPressDetail[] = []; + + handleBlur(event: GoabTextAreaOnBlurDetail) { + this.lastBlurValue = event.value ?? ""; + this.blurCount += 1; + } + + handleChange(event: GoabTextAreaOnChangeDetail) { + this.textareaValue = event.value ?? ""; + this.changeLog = [...this.changeLog, event].slice(-5); + } + + handleKeyPress(event: GoabTextAreaOnKeyPressDetail) { + this.keyPressLog = [...this.keyPressLog, event].slice(-8); + } +} diff --git a/apps/prs/angular/src/routes/features/feat2609/feat2609.component.html b/apps/prs/angular/src/routes/features/feat2609/feat2609.component.html new file mode 100644 index 0000000000..4f80be8bad --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2609/feat2609.component.html @@ -0,0 +1,245 @@ +

Feature #2609: Data Grid Component

+

This feature adds a keyboard-navigable grid wrapper component that provides ARIA-compliant accessibility for tables and grid layouts.

+ +

Table with Dynamic Row Addition (Testing Dropdown Focus Issue)

+ +
+ + Add 3 New Rows (Simulate Pagination) + + + Remove Last 3 Rows + + Total rows: {{ users.length }} +
+ +

+ Test Instructions: + 1. Navigate to a cell with a dropdown (Approver column) using arrow keys. + 2. Click "Add 3 New Rows" button. + 3. Navigate to a cell with a dropdown again. + 4. Try to navigate away with arrow keys - it should take only 1 press, not 3. +

+ + + + + + + ID + Name + Status + Approver (Dropdown) + Actions + + + + @for (user of users; track user.idNumber) { + + + {{ user.idNumber }} + {{ user.nameOfChild }} + + + + Sarah Ellis + John Doe + Jane Smith + + + + + + + + + + } + + + + +

Containers (Layout Mode)

+

Layout mode allows arrow keys to wrap between rows when reaching the edge.

+ + @for (user of users; track user.idNumber) { + + + + + + + {{ user.nameOfChild }} + + + + + + + + + Updated + {{ user.updated }} + + + Program ID + {{ user.programId }} + + + + + + Email + {{ user.email }} + + + Service access + {{ user.serviceAccess }} + + + + + + Program + {{ user.program }} + + + Approver + + Sarah Ellis + John Doe + Jane Smith + + + + + + + + + + + + + } + + +

Table with Colspan and Different Column Counts

+

This table tests navigation with varying column counts and colspan attributes. Use arrow keys to navigate and observe focus behavior.

+ + + + + Column 1 + Column 2 + Column 3 + Column 4 + Column 5 + + + + + Row 1, Cell 1 + Row 1, Cell 2 + Row 1, Cell 3 + Row 1, Cell 4 + Row 1, Cell 5 + + + Row 2, Cell 1 + Row 2, Cell 2 (spans 2 cols) + Row 2, Cell 3 (spans 2 cols) + + + Row 3, Cell 1 (spans 3 cols) + Row 3, Cell 2 (spans 2 cols) + + + Row 4, Cell 1 + Row 4, Cell 2 + Row 4, Cell 3 + Row 4, Cell 4 + Row 4, Cell 5 + + + Row 5, Single Cell (spans all 5 cols) + + + + + +

Keyboard Icon Options

+

The keyboard navigation icon can be customized with keyboardIconVisibility and keyboardIconPosition props.

+ +

Icon Position: Left (Default)

+

keyboardIconPosition="left" - Icon appears in the bottom-left corner when navigating.

+ + + + + Name + Role + Status + + + + + Alice Johnson + Developer + Active + + + Bob Smith + Designer + Active + + + + + +

Icon Position: Right

+

keyboardIconPosition="right" - Icon appears in the bottom-right corner when navigating.

+ + + + + Name + Role + Status + + + + + Carol White + Manager + Active + + + David Brown + Analyst + Active + + + + + +

Icon Visibility: Hidden

+

keyboardIconVisibility="hidden" - Keyboard navigation still works but the icon is not shown.

+ + + ARIA 1.1 Specification + Core Accessibility API Mappings 1.1 + WAI-ARIA Overview + WCAG Overview + + + +

Icon Visibility: Visible (Default)

+

keyboardIconVisibility="visible" - The keyboard icon is shown when navigating (default behavior).

+ + + Button 1 + Button 2 + Button 3 + + diff --git a/apps/prs/angular/src/routes/features/feat2609/feat2609.component.ts b/apps/prs/angular/src/routes/features/feat2609/feat2609.component.ts new file mode 100644 index 0000000000..76528147f6 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2609/feat2609.component.ts @@ -0,0 +1,194 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { + GoabBadge, + GoabBadgeType, + GoabBlock, + GoabButton, + GoabCheckbox, + GoabCheckboxOnChangeDetail, + GoabContainer, + GoabDataGrid, + GoabDropdown, + GoabDropdownItem, + GoabLink, + GoabMenuAction, + GoabMenuButton, + GoabMenuButtonOnActionDetail, + GoabTable, + GoabTableOnSortDetail, + GoabTableSortHeader, +} from "@abgov/angular-components"; + +type User = { + idNumber: string; + nameOfChild: string; + dataStarted: string; + dateSubmitted: string; + status: string; + updated: string; + email: string; + program: string; + programId: string; + serviceAccess: string; + approver: string; +}; + +@Component({ + standalone: true, + selector: "abgov-feat2609", + templateUrl: "./feat2609.component.html", + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + GoabBadge, + GoabTable, + GoabCheckbox, + GoabTableSortHeader, + GoabButton, + GoabContainer, + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabDataGrid, + GoabLink, + GoabMenuButton, + GoabMenuAction, + ], +}) +export class Feat2609Component { + users: User[] = [ + { + idNumber: "1", + nameOfChild: "Mike Zwei", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "Removed", + updated: "Jun 30, 2022 at 2:30 PM", + email: "mike.zwei@gmail.com", + program: "Wee Wild Ones Curry", + programId: "74528567", + serviceAccess: "Claims Adjustments", + approver: "Sarah Ellis", + }, + { + idNumber: "2", + nameOfChild: "Emma Stroman", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "To be removed", + updated: "Nov 28, 2021 at 1:30 PM", + email: "emma.stroman@gmail.com", + program: "Fort McMurray", + programId: "74522643", + serviceAccess: "Claims Adjustments", + approver: "Sarah Ellis", + }, + ]; + _selectedUsers: string[] = []; + isSelectedAll = false; + private nextUserId = 3; + + deleteSelected() { + this.users = this.users.filter((u) => !this._selectedUsers.includes(u.idNumber)); + this._selectedUsers = []; + } + + getStatusBadgeType(status: string): GoabBadgeType { + switch (status) { + case "Removed": + return "success"; + case "To be removed": + return "emergency"; + case "Submitted": + return "information"; + case "In review": + return "information"; + case "Awaiting documentation": + return "important"; + case "Denied": + return "emergency"; + case "Approved": + return "success"; + case "Closed": + return "information"; + default: + return "information"; + } + } + + selectAll(event: GoabCheckboxOnChangeDetail) { + this.isSelectedAll = event.checked; + if (event.checked) { + this._selectedUsers = this.users.map((u) => u.idNumber); + } else { + this._selectedUsers = []; + } + } + + isSelected(userId: string): boolean { + return this._selectedUsers.includes(userId); + } + + toggleSelection(userId: string, event: GoabCheckboxOnChangeDetail) { + if (event.checked) { + this._selectedUsers.push(userId); + } else { + this._selectedUsers = this._selectedUsers.filter((id) => id !== userId); + } + this.isSelectedAll = this._selectedUsers.length === this.users.length; + } + + handleSort(event: GoabTableOnSortDetail) { + const { sortBy, sortDir } = event; + this.users.sort((a: any, b: any) => (a[sortBy] > b[sortBy] ? 1 : -1) * sortDir); + } + + onDelete(userId: string) { + this.users = this.users.filter((u) => u.idNumber !== userId); + } + + onOpen(userId: string) { + alert("We are going to open a profile of this user " + userId); + } + + handleMenuAction(userId: string, event: GoabMenuButtonOnActionDetail) { + if (event.action === "open") { + this.onOpen(userId); + } else if (event.action === "delete") { + this.onDelete(userId); + } + } + + onApproverChange(userId: string, event: any) { + const user = this.users.find((u) => u.idNumber === userId); + if (user) { + user.approver = event.value; + } + } + + addNewRows() { + const newUsers: User[] = []; + for (let i = 0; i < 3; i++) { + newUsers.push({ + idNumber: String(this.nextUserId), + nameOfChild: `New User ${this.nextUserId}`, + dataStarted: "Dec 1, 2023", + dateSubmitted: "Dec 5, 2023", + status: "Submitted", + updated: "Dec 5, 2023 at 10:00 AM", + email: `user${this.nextUserId}@example.com`, + program: "Test Program", + programId: `9999${this.nextUserId}`, + serviceAccess: "Full Access", + approver: "Sarah Ellis", + }); + this.nextUserId++; + } + this.users = [...this.users, ...newUsers]; + } + + removeLastRows() { + if (this.users.length > 2) { + this.users = this.users.slice(0, -3); + } + } +} diff --git a/apps/prs/angular/src/routes/features/feat2611-tabs-disabled/feat2611-tabs-disabled.component.html b/apps/prs/angular/src/routes/features/feat2611-tabs-disabled/feat2611-tabs-disabled.component.html new file mode 100644 index 0000000000..a9d7688fff --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2611-tabs-disabled/feat2611-tabs-disabled.component.html @@ -0,0 +1,61 @@ +
+

Feature 2611 - Disabled Tab Edge Cases

+ +

Test Case 1: initialTab=1 with first tab disabled

+

Expected: Tab 2 should be selected (first enabled tab), not Tab 1 (disabled)

+ + +

Content 1 - This should NOT be visible

+
+ +

Content 2 - This SHOULD be visible on load

+
+ +

Content 3

+
+
+ +

Test Case 2: no initialTab with first tab disabled

+

+ Expected: Tab 2 should be selected (first enabled tab), not Tab 1 (disabled), even + without initialTab. +

+ + +

Content 1 - This should NOT be visible

+
+ +

Content 2 - This SHOULD be visible on load

+
+ +

Content 3

+
+
+ +

Test Case 3: hash change to disabled tab

+

+ Expected: If the hash is set to a disabled tab (for example + #tab-0), selection should not move to the disabled tab. The URL should + ideally normalize back to the current enabled tab hash. +

+ + Set hash to #tab-0 (disabled) + Set hash to #tab-1 (enabled) + Set hash to #tab-2 (enabled) + Clear hash + + Disabled (tab-0) + Enabled (tab-1) + Enabled (tab-2) + + +

Content A - This should NOT be visible

+
+ +

Content B - This SHOULD stay visible when hash targets disabled tab

+
+ +

Content C - Should also stay visible if hash is changed to disabled tab

+
+
+
diff --git a/apps/prs/angular/src/routes/features/feat2611-tabs-disabled/feat2611-tabs-disabled.component.ts b/apps/prs/angular/src/routes/features/feat2611-tabs-disabled/feat2611-tabs-disabled.component.ts new file mode 100644 index 0000000000..bfca090f60 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2611-tabs-disabled/feat2611-tabs-disabled.component.ts @@ -0,0 +1,25 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabTabs, + GoabTab, + GoabButtonGroup, + GoabButton, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat2611-tabs-disabled", + templateUrl: "./feat2611-tabs-disabled.component.html", + imports: [CommonModule, GoabTabs, GoabTab, GoabButtonGroup, GoabButton], +}) +export class Feat2611TabsDisabledComponent { + setHash(hash: string): void { + window.location.hash = `#${hash}`; + } + + clearHash(): void { + const { pathname, search } = window.location; + window.history.replaceState({}, "", `${pathname}${search}`); + } +} diff --git a/apps/prs/angular/src/routes/features/feat2611/feat2611.component.html b/apps/prs/angular/src/routes/features/feat2611/feat2611.component.html new file mode 100644 index 0000000000..654977b721 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2611/feat2611.component.html @@ -0,0 +1,194 @@ +

Segmented Tabs Variant (#2611)

+

+ This feature adds a new "segmented" variant to the Tabs component, featuring a + pill/button style with animated sliding background. +

+ + + +
+

Segmented Variant

+ + Overview + Details + Settings + + + + + This is the Overview tab content. The segmented variant displays tabs as + pill-shaped buttons with a sliding background indicator. + + + + + This is the Details tab content. Notice how the pill smoothly animates between + tabs. + + + + + This is the Settings tab content. The segmented style is ideal for compact + navigation within a section. + + + +
+ + +
+

Segmented Variant - Dynamic Heading Updates

+

+ Use the controls to change heading content; the pill should resize and stay aligned + after each update. +

+ + + Toggle label length + Toggle badge content + + + + {{ dynamicLabel }} + + + + + + This tab heading changes length and badge content for resize testing. + + + + Static label for comparison. + + + Another static label. + + +
+ + +
+

Default Variant (for comparison)

+

Standard tabs with underline indicator.

+ + {{ dynamicLabel }} + Details + Settings + + + + + This is the Overview tab with the default variant styling. + + + + This is the Details tab with the default variant styling. + + + + This is the Settings tab with the default variant styling. + + + +
+ + +
+

Long Labels - Segmented Variant

+

Demonstrates how long tab labels are handled in the segmented variant.

+ + Long with Badge + + + + Short label tab content. + + + Medium length label tab content. + + + Very long label tab content. + + + Long label with badge tab content. + + +
+ + +
+

Disabled Tabs - Segmented Variant

+

Demonstrates disabled tabs that cannot be clicked or navigated to.

+ + Disabled with Badge + + + + This tab is enabled and can be selected. + + + This content should not be visible (tab is disabled). + + + This tab is also enabled. Keyboard navigation skips the disabled + tab. + + + Disabled tab with badge - not accessible. + + +
+ + +
+

Disabled Tabs - Default Variant

+

Demonstrates disabled tabs in the default variant.

+ + Disabled with Badge + + + + This tab is enabled and can be selected. + + + This content should not be visible (tab is disabled). + + + This tab is also enabled. Keyboard navigation skips the disabled + tab. + + + Disabled tab with badge - not accessible. + + +
+ + +
+

Active Tab State

+ Current active tab: {{ activeTab }} +
+
diff --git a/apps/prs/angular/src/routes/features/feat2611/feat2611.component.ts b/apps/prs/angular/src/routes/features/feat2611/feat2611.component.ts new file mode 100644 index 0000000000..21898a982f --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2611/feat2611.component.ts @@ -0,0 +1,47 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabTabs, + GoabTab, + GoabBlock, + GoabText, + GoabBadge, + GoabButton, + GoabButtonGroup, + GoabTabsOnChangeDetail, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat2611", + templateUrl: "./feat2611.component.html", + imports: [ + CommonModule, + GoabTabs, + GoabTab, + GoabBlock, + GoabText, + GoabBadge, + GoabButton, + GoabButtonGroup, + ], +}) +export class Feat2611Component { + activeTab = 1; + dynamicLabel = "Overview"; + dynamicBadge = "3"; + + onTabChange(detail: GoabTabsOnChangeDetail) { + console.log("Tab changed:", detail); + this.activeTab = detail.tab; + } + + toggleDynamicLabel(): void { + this.dynamicLabel = + this.dynamicLabel === "Overview" ? "Overview with a much longer label" : "Overview"; + } + + toggleDynamicBadge(): void { + this.dynamicBadge = this.dynamicBadge === "3" ? "Text Based Content" : "3"; + } +} diff --git a/apps/prs/angular/src/routes/features/feat2682/feat2682.component.html b/apps/prs/angular/src/routes/features/feat2682/feat2682.component.html new file mode 100644 index 0000000000..dd6f44aa95 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2682/feat2682.component.html @@ -0,0 +1,95 @@ + + Feature 2682 - DatePicker Manual Testing + + + This test demonstrates various DatePicker configurations with FormItem wrappers. Check + the browser console for onChange events. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/prs/angular/src/routes/features/feat2682/feat2682.component.ts b/apps/prs/angular/src/routes/features/feat2682/feat2682.component.ts new file mode 100644 index 0000000000..40ef7fb06f --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2682/feat2682.component.ts @@ -0,0 +1,34 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabFormItem, + GoabDatePicker, + GoabBlock, + GoabText, +} from "@abgov/angular-components"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-feat2682", + templateUrl: "./feat2682.component.html", + imports: [CommonModule, GoabFormItem, GoabDatePicker, GoabBlock, GoabText], +}) +export class Feat2682Component { + // Calculate min and max dates (one month before and after today) + today = new Date(); + minDate = new Date( + this.today.getFullYear(), + this.today.getMonth() - 1, + this.today.getDate(), + ); + maxDate = new Date( + this.today.getFullYear(), + this.today.getMonth() + 1, + this.today.getDate(), + ); + + handleDateChange(detail: GoabDatePickerOnChangeDetail): void { + console.log("DatePicker onChange event:", detail); + } +} diff --git a/apps/prs/angular/src/routes/features/feat2722/feat2722.component.html b/apps/prs/angular/src/routes/features/feat2722/feat2722.component.html new file mode 100644 index 0000000000..47427a556c --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2722/feat2722.component.html @@ -0,0 +1,132 @@ +

Input Text Alignment Feature Test

+

Testing the textAlign property functionality for input components

+ +

Text Input Alignment

+

Testing left vs right alignment for text inputs

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

Number Input Alignment

+

Number inputs default to right alignment for better readability

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

Currency and Percentage Examples

+

Demonstrating right alignment for financial and percentage data

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

Test Results

+ + + Text Value: {{ textValue || "None" }} + Number Value: {{ numberValue || "None" }} + Currency Value: ${{ currencyValue || "None" }} + Percentage Value: {{ percentageValue || "None" }}% + + +

Feature Summary

+ + + + ✅ textAlign="left" - Text is left-aligned (default for text + inputs) + + + ✅ textAlign="right" - Text is right-aligned (default for number + inputs) + + + ✅ Number inputs default to right alignment for better numeric + readability + + + ✅ Currency and percentage inputs benefit from right alignment + + +
diff --git a/apps/prs/angular/src/routes/features/feat2722/feat2722.component.ts b/apps/prs/angular/src/routes/features/feat2722/feat2722.component.ts new file mode 100644 index 0000000000..3dde13669b --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2722/feat2722.component.ts @@ -0,0 +1,43 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabInput, + GoabInputNumber, + GoabBlock, + GoabText, + GoabFormItem, + GoabInputOnChangeDetail, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat2722", + templateUrl: "./feat2722.component.html", + imports: [CommonModule, GoabInput, GoabInputNumber, GoabBlock, GoabText, GoabFormItem], +}) +export class Feat2722Component { + textValue = "Sample text input"; + numberValue: number | null = 12345.67; + currencyValue: number | null = 99.99; + percentageValue: number | null = 85.5; + + onTextChange(details: GoabInputOnChangeDetail) { + console.log("Text changed:", details); + this.textValue = details.value; + } + + onNumberChange(details: GoabInputOnChangeDetail) { + console.log("Number changed:", details); + this.numberValue = +details.value; + } + + onCurrencyChange(details: GoabInputOnChangeDetail) { + console.log("Currency changed:", details); + this.currencyValue = +details.value; + } + + onPercentageChange(details: GoabInputOnChangeDetail) { + console.log("Percentage changed:", details); + this.percentageValue = +details.value; + } +} diff --git a/apps/prs/angular/src/routes/features/feat2730/feat2730.component.css b/apps/prs/angular/src/routes/features/feat2730/feat2730.component.css new file mode 100644 index 0000000000..4a73cbe49a --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2730/feat2730.component.css @@ -0,0 +1,21 @@ +.history-item { + border-left: 3px solid var(--goa-color-info-default); + padding-left: var(--goa-space-m); + margin-bottom: var(--goa-space-s); +} + +pre { + background-color: var(--goa-color-greyscale-100); + padding: var(--goa-space-m); + border-radius: var(--goa-border-radius-s); + overflow-x: auto; + font-family: monospace; + font-size: 0.9em; +} + +code { + background-color: var(--goa-color-greyscale-100); + padding: var(--goa-space-2xs) var(--goa-space-xs); + border-radius: var(--goa-border-radius-xs); + font-family: monospace; +} diff --git a/apps/prs/angular/src/routes/features/feat2730/feat2730.component.html b/apps/prs/angular/src/routes/features/feat2730/feat2730.component.html new file mode 100644 index 0000000000..a1c09616fc --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2730/feat2730.component.html @@ -0,0 +1,206 @@ + + + + + +

Controller Positioning

+

Configure where notifications appear on the screen

+ + + + + Top + Bottom + + + + + + Left + Center + Right + + + + + +

Notification Configuration

+

Customize notification settings

+ + + + + + + + + + + + + + + + + + + + + + Short (2s) + Medium (4s) + Long (6s) + Custom (8s) + + + + + +

Basic Notification Tests

+

Test different notification types and behaviors

+ + + + Show Basic Notification + + + Show Success Notification + + + Show Failure Notification + + + + + + Show Indeterminate Notification + + + Show Notification with Action + + + + +

Progress Notification Tests

+

Test determinate and indeterminate progress indicators

+ + + + Start Progress Notification + + + Stop Progress + + + + + Current Progress: {{ progressValue }}% + Progress UUID: {{ currentProgressUuid }} + + + +

Queue Testing

+

Test multiple notifications in queue (FIFO order)

+ + + + Show 5 Notifications in Queue + + + + +

Cancel/Replace Testing

+

Test cancelling and replacing notifications

+ + + + Show Cancellable Notification + + + Cancel Last Notification + + + + +

Test Results

+

Track notification history and UUIDs

+ + + Last Notification UUID: + {{ lastNotificationUuid || "None" }} + + Clear History + + + +

Notification History (Last 10)

+ +
+ + {{ notification.timestamp.toLocaleTimeString() }} - + {{ notification.type }}: {{ notification.message }} + + UUID: {{ notification.uuid }} +
+ + No notifications yet. Try clicking some buttons above! + +
+
+--> diff --git a/apps/prs/angular/src/routes/features/feat2730/feat2730.component.ts b/apps/prs/angular/src/routes/features/feat2730/feat2730.component.ts new file mode 100644 index 0000000000..4e2e4298c5 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2730/feat2730.component.ts @@ -0,0 +1,272 @@ +import { Component, OnInit } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabButton, + GoabBlock, + GoabText, + GoabFormItem, + GoabInput, + GoabDropdown, + GoabDropdownItem, + GoabTemporaryNotificationCtrl, + GoabDropdownOnChangeDetail, +} from "@abgov/angular-components"; +import { + GoabInputOnChangeDetail, + TemporaryNotification, +} from "@abgov/ui-components-common"; + +@Component({ + standalone: true, + selector: "abgov-feat2730", + templateUrl: "./feat2730.component.html", + styleUrls: ["./feat2730.component.css"], + imports: [ + CommonModule, + GoabButton, + GoabBlock, + GoabText, + GoabFormItem, + GoabInput, + GoabDropdown, + GoabDropdownItem, + GoabTemporaryNotificationCtrl, + ], +}) +export class Feat2730Component implements OnInit { + // Controller positioning + verticalPosition: "top" | "bottom" = "bottom"; + horizontalPosition: "left" | "center" | "right" = "center"; + + // Notification settings + message = "This is a test notification message"; + notificationType: "basic" | "success" | "failure" | "indeterminate" | "progress" = + "basic"; + duration = 4000; + actionText = ""; + progressValue = 0; + + // Progress simulation + progressInterval: any; + currentProgressUuid = ""; + + // Test results + lastNotificationUuid = ""; + notificationHistory: Array<{ + uuid: string; + message: string; + type: string; + timestamp: Date; + }> = []; + + ngOnInit() { + // Initialize with a welcome message + this.showWelcomeNotification(); + } + + changeMessage(details: GoabInputOnChangeDetail) { + this.message = details.value; + } + + changeDuration(details: GoabInputOnChangeDetail) { + this.duration = +details.value; + } + + changeActionText(details: GoabInputOnChangeDetail) { + this.actionText = details.value; + } + + // Basic notification tests + showBasicNotification() { + const uuid = TemporaryNotification.show(this.message, { + type: "basic", + duration: this.duration, + actionText: this.actionText || undefined, + }); + this.trackNotification(uuid, this.message, "basic"); + } + + showSuccessNotification() { + const uuid = TemporaryNotification.show(this.message, { + type: "success", + duration: this.duration, + actionText: this.actionText || undefined, + }); + this.trackNotification(uuid, this.message, "success"); + } + + showFailureNotification() { + const uuid = TemporaryNotification.show(this.message, { + type: "failure", + duration: this.duration, + actionText: this.actionText || undefined, + }); + this.trackNotification(uuid, this.message, "failure"); + } + + showIndeterminateNotification() { + const uuid = TemporaryNotification.show(this.message, { + type: "indeterminate", + duration: this.duration, + actionText: this.actionText || undefined, + }); + this.trackNotification(uuid, this.message, "indeterminate"); + } + + // Progress notification tests + startProgressNotification() { + this.progressValue = 0; + const uuid = TemporaryNotification.show(this.message, { + type: "progress", + duration: undefined, // No auto-dismiss for progress + actionText: this.actionText || undefined, + }); + this.currentProgressUuid = uuid; + this.trackNotification(uuid, this.message, "progress"); + + // Simulate progress updates + this.progressInterval = setInterval(() => { + this.progressValue += 10; + TemporaryNotification.setProgress(uuid, this.progressValue); + + if (this.progressValue >= 100) { + clearInterval(this.progressInterval); + this.progressValue = 0; + this.currentProgressUuid = ""; + } + }, 500); + } + + stopProgressNotification() { + if (this.progressInterval) { + clearInterval(this.progressInterval); + this.progressValue = 0; + this.currentProgressUuid = ""; + } + } + + // Queue testing + showMultipleNotifications() { + const messages = [ + "First notification in queue", + "Second notification in queue", + "Third notification in queue", + "Fourth notification in queue", + "Fifth notification in queue", + ]; + + messages.forEach((msg, index) => { + setTimeout(() => { + const uuid = TemporaryNotification.show(msg, { + type: "basic", + duration: 2000, + }); + this.trackNotification(uuid, msg, "basic"); + }, index * 500); + }); + } + + // Action testing + showNotificationWithAction() { + const uuid = TemporaryNotification.show("Would you like to undo this action?", { + type: "basic", + duration: 8000, + actionText: "Undo", + action: () => { + console.log("Undo action clicked!"); + TemporaryNotification.show("Action undone successfully!", { + type: "success", + duration: 3000, + }); + }, + }); + this.trackNotification( + uuid, + "Would you like to undo this action?", + "basic with action", + ); + } + + // Cancel/replace testing + showCancellableNotification() { + const uuid = TemporaryNotification.show("This notification can be cancelled", { + type: "basic", + duration: 10000, + }); + this.lastNotificationUuid = uuid; + this.trackNotification(uuid, "This notification can be cancelled", "basic"); + } + + cancelLastNotification() { + if (this.lastNotificationUuid) { + TemporaryNotification.show("Previous notification cancelled", { + type: "success", + cancelUUID: this.lastNotificationUuid, + duration: 3000, + }); + this.lastNotificationUuid = ""; + } + } + + // Welcome notification + showWelcomeNotification() { + const uuid = TemporaryNotification.show( + "Welcome to the Temporary Notification test page! 🎉", + { + type: "success", + duration: 5000, + }, + ); + this.trackNotification( + uuid, + "Welcome to the Temporary Notification test page! 🎉", + "success", + ); + } + + // Utility methods + private trackNotification(uuid: string, message: string, type: string) { + this.lastNotificationUuid = uuid; + this.notificationHistory.unshift({ + uuid, + message, + type, + timestamp: new Date(), + }); + + // Keep only last 10 notifications + if (this.notificationHistory.length > 10) { + this.notificationHistory = this.notificationHistory.slice(0, 10); + } + } + + clearHistory() { + this.notificationHistory = []; + } + + // Duration presets + setDurationShort() { + this.duration = 2000; + } + + setDurationMedium() { + this.duration = 4000; + } + + setDurationLong() { + this.duration = 6000; + } + + setDurationCustom() { + this.duration = 8000; + } + + // Dropdown change handlers + onVerticalPositionChange(details: GoabDropdownOnChangeDetail) { + this.verticalPosition = details.value as "top" | "bottom"; + } + + onHorizontalPositionChange(details: GoabDropdownOnChangeDetail) { + this.horizontalPosition = details.value as "left" | "center" | "right"; + } +} diff --git a/apps/prs/angular/src/routes/features/feat2829/feat2829.component.html b/apps/prs/angular/src/routes/features/feat2829/feat2829.component.html new file mode 100644 index 0000000000..9576fc17b9 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2829/feat2829.component.html @@ -0,0 +1,384 @@ + +

Feature 2829: Modal with Scrolling Content

+ +

+ This feature demonstrates a modal with extensive content that requires scrolling on a + 4K screen. +

+ + Open Modal (Dialog) + + + Open Modal (Alert Dialog) + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute + irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia + deserunt mollit anim id est laborum. + + + + Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium + doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore + veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam + voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur + magni dolores eos qui ratione voluptatem sequi nesciunt. + + + + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, + adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore + magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum + exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi + consequatur? + + + + Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil + molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? + At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis + praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias + excepturi sint occaecati cupiditate non provident. + + + + Similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et + dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero + tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod + maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor + repellendus. + + + + Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe + eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum + rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias + consequatur aut perferendis doloribus asperiores repellat. + + + + On the other hand, we denounce with righteous indignation and dislike men who are so + beguiled and demoralized by the charms of pleasure of the moment, so blinded by + desire, that they cannot foresee the pain and trouble that are bound to ensue; and + equal blame belongs to those who fail in their duty through weakness of will, which + is the same as saying through shrinking from toil and pain. + + + + These cases are perfectly simple and easy to distinguish. In a free hour, when our + power of choice is untrammelled and when nothing prevents our being able to do what + we like best, every pleasure is to be welcomed and every pain avoided. But in + certain circumstances and owing to the claims of duty or the obligations of business + it will frequently occur that pleasures have to be repudiated and annoyances + accepted. + + + + The wise man therefore always holds in these matters to this principle of selection: + he rejects pleasures to secure other greater pleasures, or else he endures pains to + avoid worse pains. But I must explain to you how all this mistaken idea of + denouncing pleasure and praising pain was born and I will give you a complete + account of the system, and expound the actual teachings of the great explorer of the + truth. + + + + The master-builder of human happiness. No one rejects, dislikes, or avoids pleasure + itself, because it is pleasure, but because those who do not know how to pursue + pleasure rationally encounter consequences that are extremely painful. Nor again is + there anyone who loves or pursues or desires to obtain pain of itself, because it is + pain, but because occasionally circumstances occur in which toil and pain can + procure him some great pleasure. + + + + + + + + + To take a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find fault with a + man who chooses to enjoy a pleasure that has no annoying consequences, or one who + avoids a pain that produces no resultant pleasure? On the other hand, we denounce + with righteous indignation and dislike men who are so beguiled and demoralized by + the charms of pleasure of the moment. + + + + So blinded by desire, that they cannot foresee the pain and trouble that are bound + to ensue; and equal blame belongs to those who fail in their duty through weakness + of will, which is the same as saying through shrinking from toil and pain. These + cases are perfectly simple and easy to distinguish. In a free hour, when our power + of choice is untrammelled and when nothing prevents our being able to do what we + like best. + + + + Every pleasure is to be welcomed and every pain avoided. But in certain + circumstances and owing to the claims of duty or the obligations of business it will + frequently occur that pleasures have to be repudiated and annoyances accepted. The + wise man therefore always holds in these matters to this principle of selection: he + rejects pleasures to secure other greater pleasures, or else he endures pains to + avoid worse pains. + + + + But I must explain to you how all this mistaken idea of denouncing pleasure and + praising pain was born and I will give you a complete account of the system, and + expound the actual teachings of the great explorer of the truth, the master-builder + of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it + is pleasure, but because those who do not know how to pursue pleasure rationally + encounter consequences that are extremely painful. + + + + Nor again is there anyone who loves or pursues or desires to obtain pain of itself, + because it is pain, but because occasionally circumstances occur in which toil and + pain can procure him some great pleasure. To take a trivial example, which of us + ever undertakes laborious physical exercise, except to obtain some advantage from + it? But who has any right to find fault with a man who chooses to enjoy a pleasure + that has no annoying consequences. + + + + Or one who avoids a pain that produces no resultant pleasure? On the other hand, we + denounce with righteous indignation and dislike men who are so beguiled and + demoralized by the charms of pleasure of the moment, so blinded by desire, that they + cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs + to those who fail in their duty through weakness of will. + + + + Which is the same as saying through shrinking from toil and pain. These cases are + perfectly simple and easy to distinguish. In a free hour, when our power of choice + is untrammelled and when nothing prevents our being able to do what we like best, + every pleasure is to be welcomed and every pain avoided. But in certain + circumstances and owing to the claims of duty or the obligations of business it will + frequently occur that pleasures have to be repudiated and annoyances accepted. + + + + The wise man therefore always holds in these matters to this principle of selection: + he rejects pleasures to secure other greater pleasures, or else he endures pains to + avoid worse pains. But I must explain to you how all this mistaken idea of + denouncing pleasure and praising pain was born and I will give you a complete + account of the system, and expound the actual teachings of the great explorer of the + truth. + + + + + + + + +
+ Close Modal +
+
+ + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute + irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia + deserunt mollit anim id est laborum. + + + + Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium + doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore + veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam + voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur + magni dolores eos qui ratione voluptatem sequi nesciunt. + + + + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, + adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore + magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum + exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi + consequatur? + + + + Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil + molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? + At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis + praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias + excepturi sint occaecati cupiditate non provident. + + + + Similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et + dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero + tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod + maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor + repellendus. + + + + Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe + eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum + rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias + consequatur aut perferendis doloribus asperiores repellat. + + + + On the other hand, we denounce with righteous indignation and dislike men who are so + beguiled and demoralized by the charms of pleasure of the moment, so blinded by + desire, that they cannot foresee the pain and trouble that are bound to ensue; and + equal blame belongs to those who fail in their duty through weakness of will, which + is the same as saying through shrinking from toil and pain. + + + + These cases are perfectly simple and easy to distinguish. In a free hour, when our + power of choice is untrammelled and when nothing prevents our being able to do what + we like best, every pleasure is to be welcomed and every pain avoided. But in + certain circumstances and owing to the claims of duty or the obligations of business + it will frequently occur that pleasures have to be repudiated and annoyances + accepted. + + + + The wise man therefore always holds in these matters to this principle of selection: + he rejects pleasures to secure other greater pleasures, or else he endures pains to + avoid worse pains. But I must explain to you how all this mistaken idea of + denouncing pleasure and praising pain was born and I will give you a complete + account of the system, and expound the actual teachings of the great explorer of the + truth. + + + + The master-builder of human happiness. No one rejects, dislikes, or avoids pleasure + itself, because it is pleasure, but because those who do not know how to pursue + pleasure rationally encounter consequences that are extremely painful. Nor again is + there anyone who loves or pursues or desires to obtain pain of itself, because it is + pain, but because occasionally circumstances occur in which toil and pain can + procure him some great pleasure. + + + + + + + + + To take a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find fault with a + man who chooses to enjoy a pleasure that has no annoying consequences, or one who + avoids a pain that produces no resultant pleasure? On the other hand, we denounce + with righteous indignation and dislike men who are so beguiled and demoralized by + the charms of pleasure of the moment. + + + + So blinded by desire, that they cannot foresee the pain and trouble that are bound + to ensue; and equal blame belongs to those who fail in their duty through weakness + of will, which is the same as saying through shrinking from toil and pain. These + cases are perfectly simple and easy to distinguish. In a free hour, when our power + of choice is untrammelled and when nothing prevents our being able to do what we + like best. + + + + Every pleasure is to be welcomed and every pain avoided. But in certain + circumstances and owing to the claims of duty or the obligations of business it will + frequently occur that pleasures have to be repudiated and annoyances accepted. The + wise man therefore always holds in these matters to this principle of selection: he + rejects pleasures to secure other greater pleasures, or else he endures pains to + avoid worse pains. + + + + But I must explain to you how all this mistaken idea of denouncing pleasure and + praising pain was born and I will give you a complete account of the system, and + expound the actual teachings of the great explorer of the truth, the master-builder + of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it + is pleasure, but because those who do not know how to pursue pleasure rationally + encounter consequences that are extremely painful. + + + + Nor again is there anyone who loves or pursues or desires to obtain pain of itself, + because it is pain, but because occasionally circumstances occur in which toil and + pain can procure him some great pleasure. To take a trivial example, which of us + ever undertakes laborious physical exercise, except to obtain some advantage from + it? But who has any right to find fault with a man who chooses to enjoy a pleasure + that has no annoying consequences. + + + + Or one who avoids a pain that produces no resultant pleasure? On the other hand, we + denounce with righteous indignation and dislike men who are so beguiled and + demoralized by the charms of pleasure of the moment, so blinded by desire, that they + cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs + to those who fail in their duty through weakness of will. + + + + Which is the same as saying through shrinking from toil and pain. These cases are + perfectly simple and easy to distinguish. In a free hour, when our power of choice + is untrammelled and when nothing prevents our being able to do what we like best, + every pleasure is to be welcomed and every pain avoided. But in certain + circumstances and owing to the claims of duty or the obligations of business it will + frequently occur that pleasures have to be repudiated and annoyances accepted. + + + + The wise man therefore always holds in these matters to this principle of selection: + he rejects pleasures to secure other greater pleasures, or else he endures pains to + avoid worse pains. But I must explain to you how all this mistaken idea of + denouncing pleasure and praising pain was born and I will give you a complete + account of the system, and expound the actual teachings of the great explorer of the + truth. + + + + + + + + +
+ + Close Modal + +
+
+
diff --git a/apps/prs/angular/src/routes/features/feat2829/feat2829.component.ts b/apps/prs/angular/src/routes/features/feat2829/feat2829.component.ts new file mode 100644 index 0000000000..06c9be21d0 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat2829/feat2829.component.ts @@ -0,0 +1,45 @@ +import { Component } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + GoabButton, + GoabModal, + GoabText, + GoabInput, + GoabFormItem, + GoabBlock, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat2829", + templateUrl: "./feat2829.component.html", + imports: [ + CommonModule, + GoabButton, + GoabModal, + GoabText, + GoabInput, + GoabFormItem, + GoabBlock, + ], +}) +export class Feat2829Component { + isModalOpen = false; + isAlertModalOpen = false; + + openModal(): void { + this.isModalOpen = true; + } + + closeModal(): void { + this.isModalOpen = false; + } + + openAlertModal(): void { + this.isAlertModalOpen = true; + } + + closeAlertModal(): void { + this.isAlertModalOpen = false; + } +} diff --git a/apps/prs/angular/src/routes/features/feat3102/feat3102.component.html b/apps/prs/angular/src/routes/features/feat3102/feat3102.component.html new file mode 100644 index 0000000000..ac8b4bb2c1 --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3102/feat3102.component.html @@ -0,0 +1,34 @@ + + + + 3102 + - Allow icon to be set on MenuButton + + + All the MenuButton to have a leading icon set + + + + + + + + + + + + diff --git a/apps/prs/angular/src/routes/features/feat3102/feat3102.component.ts b/apps/prs/angular/src/routes/features/feat3102/feat3102.component.ts new file mode 100644 index 0000000000..8e300689ce --- /dev/null +++ b/apps/prs/angular/src/routes/features/feat3102/feat3102.component.ts @@ -0,0 +1,28 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { + GoabBlock, + GoabDivider, + GoabMenuAction, + GoabMenuButton, + GoabText, +} from "@abgov/angular-components"; + +@Component({ + standalone: true, + selector: "abgov-feat3102", + templateUrl: "./feat3102.component.html", + imports: [ + CommonModule, + GoabBlock, + GoabMenuAction, + GoabMenuButton, + GoabText, + GoabDivider, + ], +}) +export class Feat3102Component { + onAction(e: unknown) { + console.log(e); + } +} diff --git a/apps/prs/angular/src/styles.css b/apps/prs/angular/src/styles.css new file mode 100644 index 0000000000..963ef40b19 --- /dev/null +++ b/apps/prs/angular/src/styles.css @@ -0,0 +1,6 @@ +/* You can add global styles to this file, and also import other style files */ +@import "../../../../dist/libs/web-components/index.css"; + +:root { + --goa-space-fill: 32ch; +} diff --git a/apps/prs/angular/tsconfig.app.json b/apps/prs/angular/tsconfig.app.json new file mode 100644 index 0000000000..fff4a41d44 --- /dev/null +++ b/apps/prs/angular/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/apps/prs/angular/tsconfig.editor.json b/apps/prs/angular/tsconfig.editor.json new file mode 100644 index 0000000000..4ee6393404 --- /dev/null +++ b/apps/prs/angular/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": [] + } +} diff --git a/apps/prs/angular/tsconfig.json b/apps/prs/angular/tsconfig.json new file mode 100644 index 0000000000..b94f8837df --- /dev/null +++ b/apps/prs/angular/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + } + ], + "extends": "../../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/apps/prs/react/.eslintrc.json b/apps/prs/react/.eslintrc.json new file mode 100644 index 0000000000..75b85077de --- /dev/null +++ b/apps/prs/react/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nx/react", "../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/apps/prs/react/index.html b/apps/prs/react/index.html new file mode 100644 index 0000000000..d2a4aba1f8 --- /dev/null +++ b/apps/prs/react/index.html @@ -0,0 +1,27 @@ + + + + + + React Playground + + + + + + + + + + +
+ + + + diff --git a/apps/prs/react/project.json b/apps/prs/react/project.json new file mode 100644 index 0000000000..5d029099c5 --- /dev/null +++ b/apps/prs/react/project.json @@ -0,0 +1,61 @@ +{ + "name": "react-prs", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/prs/react/src", + "projectType": "application", + "targets": { + "build": { + "executor": "@nx/vite:build", + "outputs": ["{options.outputPath}"], + "defaultConfiguration": "production", + "options": { + "outputPath": "dist/apps/prs/react" + }, + "configurations": { + "development": { + "mode": "development" + }, + "production": { + "mode": "production" + } + } + }, + "serve": { + "executor": "@nx/vite:dev-server", + "defaultConfiguration": "development", + "options": { + "buildTarget": "react-prs:build" + }, + "configurations": { + "development": { + "buildTarget": "react-prs:build:development", + "hmr": true + }, + "production": { + "buildTarget": "react-prs:build:production", + "hmr": false + } + } + }, + "preview": { + "executor": "@nx/vite:preview-server", + "defaultConfiguration": "development", + "options": { + "buildTarget": "react-prs:build" + }, + "configurations": { + "development": { + "buildTarget": "react-prs:build:development" + }, + "production": { + "buildTarget": "react-prs:build:production" + } + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"] + } + }, + "tags": [] +} diff --git a/apps/prs/react/public/favicon.ico b/apps/prs/react/public/favicon.ico new file mode 100644 index 0000000000..317ebcb233 Binary files /dev/null and b/apps/prs/react/public/favicon.ico differ diff --git a/apps/prs/react/src/app/all.tsx b/apps/prs/react/src/app/all.tsx new file mode 100644 index 0000000000..02c4a0a3dd --- /dev/null +++ b/apps/prs/react/src/app/all.tsx @@ -0,0 +1,4828 @@ +import React, { useState } from "react"; + +import { Outlet } from "react-router-dom"; +import { + GoabAppFooter, + GoabMicrositeHeader, + GoabOneColumnLayout, + GoabSideMenu, + GoabSideMenuGroup, + GoabPageBlock, + GoabFormItem, + GoabRadioGroup, + GoabRadioItem, + GoabButton, + GoabSpacer, + GoabDropdown, + GoabDropdownItem, + GoabInput, + GoabBlock, + GoabDatePicker, + GoabTooltip, + GoabIcon, + GoabBadge, + GoabText, + GoabModal, + GoabButtonGroup, + GoabTextarea, + GoabTabs, + GoabTab, + GoabDivider, + GoabIconButton, + GoabCircularProgress, + GoabContainer, + GoabDetails, + GoabHeroBanner, + GoabHeroBannerActions, + GoabNotification, + GoabAppFooterMetaSection, + GoabAppFooterNavSection, + GoabFileUploadInput, + GoabSideMenuHeading, + GoabSkeleton, + GoabCheckbox, + GoabFormStep, + GoabFormStepper, + GoabPages, + GoabPopover, + GoabTable, + GoabTableSortHeader, + GoabGrid, + GoabLink, +} from "@abgov/react-components"; + +import { + GoabDropdownOnChangeDetail, + GoabInputOnChangeDetail, + GoabTextAreaOnChangeDetail, +} from "@abgov/ui-components-common"; + +function onChange(tabIndex: number): void { + console.log("Tab changed to ", tabIndex); +} + +export function AllComponents() { + // hooks + const [destructiveModalOpen, setDestructiveModalOpen] = useState(); + const [basicModalOpen, setBasicModalOpen] = useState(); + const [basicModal2Open, setBasicModal2Open] = useState(); + const [basicModal3Open, setBasicModal3Open] = useState(); + const [contentModalOpen, setContentModalOpen] = useState(); + const [contentModalScrollOpen, setContentModalScrollOpen] = useState(); + const [contentModal2Open, setContentModal2Open] = useState(); + const [NoHeaderModalOpen, setNoHeaderModalOpen] = useState(); + const [step, setStep] = useState(-1); + const [step2, setStep2] = useState(-1); + // eslint-disable-next-line @typescript-eslint/no-empty-function + const noop = () => {}; + + function radio1(name: string, value: string) { + console.log("onChange", name, value); + } + + function radio2(name: string, value: string) { + console.log("onChange", name, value); + } + + function radio3(name: string, value: string) { + console.log("onChange", name, value); + } + + const popovertarget = ( + + Click me + + ); + const [value, setValue] = useState(""); + + function onChangeDropdown(detail: GoabDropdownOnChangeDetail) { + setValue(detail.value as string); + } + + function onChangeTextArea(detail: GoabTextAreaOnChangeDetail) { + console.log(detail.value); + } + + interface User { + firstName: string; + lastName: string; + age: number; + } + + const [users, setUsers] = useState([]); + + const _users: User[] = [ + { + firstName: "Christian", + lastName: "Batz", + age: 18, + }, + { + firstName: "Brain", + lastName: "Wisozk", + age: 19, + }, + { + firstName: "Neha", + lastName: "Jones", + age: 23, + }, + { + firstName: "Tristin", + lastName: "Buckridge", + age: 31, + }, + ]; + + React.useEffect(() => { + setUsers(_users); + }, []); + + function sortData(sortBy: string, sortDir: number) { + const _users = [...users]; + _users.sort((a: any, b: any) => { + return (a[sortBy] > b[sortBy] ? 1 : -1) * sortDir; + }); + setUsers(_users); + } + + const containeractions = ( + + + + Edit + + + ); + + const containeractionsinverse = ( + + + + Edit + + + ); + + return ( + + {/* Main page content here */} +
+ + + + onChange(detail.tab)}> + + + --- + + + {/* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Components + + } + > + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Badge + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Button + + + + Primary + Secondary + Tertiary + + + + Primary + + Secondary + + + Tertiary + + + + + Primary + + Secondary + + + Tertiary + + + + + Compact primary + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + Destructive primary + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + Start + + + + Inverse (experimental) + + + + Regular primary + Regular secondary + Regular tertiary + + +
+ + Inverse primary + + Inverse secondary + + + Inverse tertiary + + +
+ + + Disabled + + + + Primary + + Secondary + + + Tertiary + + + + + + Primary + + + Secondary + + + Tertiary + + + + + + Primary + + + Secondary + + + Tertiary + + + + + + Cmpact primary + + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Disabled start + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Button group + + + + Default + Button + Group + + + + Compact + + Button + + + Group + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Checkbox + + + + + + + + Help text with a link. + + } + > + + + Help text with a link. + + } + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Container + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Interactive filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Info with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Info with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Info filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Error with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Error with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Error filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Success with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Success with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Success filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Important with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Important with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Important filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive, compact with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive, compact with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive, compact + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Date picker + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Detail + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vel + lacinia metus, sed sodales lectus. Aliquam sed volutpat velit. + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vel + lacinia metus, sed sodales lectus. Aliquam sed volutpat velit. + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Divider + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Dropdown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + File upload + + + + + { + /* do nothing */ + }} + /> + + + + { + /** do nothing **/ + }} + /> + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Form item + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + /** do nothing **/ + }} + /> + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Form stepper + + + + setStep(e.step)}> + + + + + + +
Page 1 content
+
Page 2 content
+
Page 3 content
+
Page 4 content
+
+ + setStep2(e.step)}> + + + + + + + +
Page 1 content
+
Page 2 content
+
Page 3 content
+
Page 4 content
+
Page 5 content
+
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Hero Banner + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Icon + + + + Tshirt sizing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Number sizing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Inverted + +
+ + + + + + +
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Icon button + + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + +
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Link + + + + Link with a leading icon + + Link with a trailing icon + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Microsite header + + + + + + + + + + + Feedback link + + + + + + + + + + Version number + + + + + + + + + + Feedback link and Version number + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Modal + + + + setDestructiveModalOpen(true)} + > + Delete my application + + + + setDestructiveModalOpen(false)} + > + Cancel + + { + setDestructiveModalOpen(false); + }} + > + Delete application + + + } + > +

This action cannot be undone.

+
+ + setBasicModalOpen(true)}> + Open basic modal with close + + + setBasicModalOpen(false)} + > +

+ This is meant to be dismissed, the user can click outside of the modal + or click the close button in the top right corner. +

+
+ + setBasicModal2Open(true)}> + Open basic modal with actions + + + + setBasicModal2Open(false)} + > + Cancel + + { + setBasicModal2Open(false); + }} + > + Continue + + + } + > +

+ This is meant to make the user choose an option in order to continue. +

+
+ + setContentModalOpen(true)}> + Open modal with lots of content and actions + + + + setContentModalOpen(false)} + > + Cancel + + { + setContentModalOpen(false); + }} + > + Continue + + + } + > +

+ This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal + scroll.This is a lot of content that make the modal scroll. This is a + lot of content that make the modal scroll. This is a lot of content + that make the modal scroll. This is a lot of content that make the + modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. +

+ + ): void { + throw new Error("Function not implemented."); + }} + > + {" "} +
+ + setContentModal2Open(true)}> + Open modal with lots of content and close button + + + setContentModal2Open(false)} + > +

+ This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. +

+
+ + setBasicModal3Open(true)}> + Open basic modal with actions and close button + + + setBasicModal3Open(false)} + actions={ + + setBasicModal3Open(false)} + > + Cancel + + { + setBasicModal3Open(false); + }} + > + Continue + + + } + > +

+ The use can dismiss the modal by clicking outside of the modal, + clicking the close button, or choose an option to continue.{" "} +

+
+ + setNoHeaderModalOpen(true)}> + Open modal with no header + + + setNoHeaderModalOpen(false)} */ + actions={ + + setNoHeaderModalOpen(false)} + > + Cancel + + { + setNoHeaderModalOpen(false); + }} + > + Continue + + + } + > +

+ This is a modal with no header. Choose an option to continue. Lorem + ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + facilisis quam ac massa commodo fringilla. Sed gravida elit urna, vel + rhoncus velit ullamcorper vitae. Phasellus ullamcorper enim et leo + dignissim, sed dignissim mi varius. +

+
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Notification banner + + + + + Notification banner message + + + + Notification banner message that is really long and eventually it wraps + around the screen because it's so long that it needs to wrap around the + screen + + + + Notification banner message + + + + Notification banner message + + + + Notification banner message + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Pagination + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Popover + + + + +

This is a popover

+ It can be used for a number of different contexts. +
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Progress indicator + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Radio + + + + + radio1(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + +
+ + {" "} + {" "} +
+
+ + {" "} +
+ + {" "} + {" "} +
+
+
+
+ + + radio2(e.name, e.value)} + > + + + + + + + + + radio3(e.name, e.value)} + > + + Help text with a link. + + } + /> + + + + + + + radio3(e.name, e.value)} + > + + Help text with a link. + + } + /> + + + + + + + radio2(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + + + + + + + radio2(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + + + + + + +
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Scroll bar + + + + setContentModalScrollOpen(true)} + > + Open modal with lots of content to see scroll bar + + + + setContentModalScrollOpen(false)} + > + Cancel + + { + setContentModalScrollOpen(false); + }} + > + Continue + + + } + > +

+ This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that make + the modal scroll. This is a lot of content that make the modal scroll. + This is a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. +

+
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Side menu + + + + + + +
+ + + This is a side menu heading + + This is a side menu item + This is another side menu item + + + This is another side menu heading + + Side menu item + Side menu item + + } + > + Side menu heading + + + Foo + Bar + + + Foo + Bar + + Foo + Bar + + Foo + Bar + + + + +
+ + +
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Table + + + + + + + Status + Text + Number + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + + + Status + Text + Number + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + sortData(e.sortBy, e.sortDir)}> + + + + + First name + + + + + Last name + + + + + Age + + + + + + {users.map((user) => ( + + {user.firstName} + {user.lastName} + {user.age} + + ))} + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Tabs + + + + + + Tab 1 content: Lorem ipsum dolor sit amet, consectetur adipiscing + elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. + + + Tab 2 content: Lorem ipsum dolor sit amet, consectetur adipiscing + elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. + + + Tab 3 content: Lorem ipsum dolor sit amet, consectetur adipiscing + elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. + + + + + + + + + + No content + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Text area + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Tooltip + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + + + + + + + + + + {/* TODO: add file cards on upload file. eslint-disable-next-line @typescript-eslint/no-empty-function */} + console.log(file)} + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + + + Status + Text + Number + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + + Text that runs really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really long{" "} + + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + + + Status + Text + Number + Action + + + + + + + + + Text that runs really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really long + + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + sortData(e.sortBy, e.sortDir)}> + + + First name + + + Last name + + + + + Age + + + + + + {users.map((user) => ( + + {user.firstName} + {user.lastName} + {user.age} + + ))} + + + + + + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + {" "} + Back link{" "} + + + {/* Apply max width to input, not form item for fixed width inputs. */} + + + Heading extra large as page h1 + + + + Heading large + + + + Heading medium + + + + Heading small + + + + Heading extra small + + + + Body large Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec + rutrum dignissim erat quis iaculis. + + + + Body medium text, lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec rutrum dignissim erat quis iaculis. + + + + Body small text, lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec rutrum dignissim erat quis iaculis. + + + + Body extra small text, lorem ipsum dolor sit amet, consectetur adipiscing + elit. Donec rutrum dignissim erat quis iaculis. + + + + Text component with margin top and bottom + + + + Text component with margin top + + + + Text component with margin bottom + + + + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + Image + + + + + + + + Text + + + + + + + + Title + + + + + + + + Text-small + + + + + + + + Avatar + + + + + + + + Header + + + + + + + + Paragraph + + + + + + + + Thumbnail + + + + + + + + Card + + + + + + + + Profile + + + + + + + +
+
+
+ +
+ + + Link 123we + Link 2 + Link 3 + Other thing + + + Link 123we + Link 2 + Link 3 + Other thing + + + Meta link + Meta link + Meta link + Meta link + + + + + + {" "} + + + + + Meta link + Meta link + Meta link + Meta link + + + + + + Link 1 + Link 2 + Link 3 + Other thing + + +
+
+ ); +} + +export default AllComponents; diff --git a/apps/prs/react/src/app/app.module.css b/apps/prs/react/src/app/app.module.css new file mode 100644 index 0000000000..2a68e717ae --- /dev/null +++ b/apps/prs/react/src/app/app.module.css @@ -0,0 +1,7 @@ +/* Your styles goes here. */ +.header-dropdown { + display: flex; + font-size: var(--goa-font-size-2); + text-decoration: underline; + color: var(--goa-color-interactive-default); +} \ No newline at end of file diff --git a/apps/prs/react/src/app/app.tsx b/apps/prs/react/src/app/app.tsx new file mode 100644 index 0000000000..18bf1e7c81 --- /dev/null +++ b/apps/prs/react/src/app/app.tsx @@ -0,0 +1,97 @@ +import { Link, Outlet } from "react-router-dom"; +import { + GoabAppFooter, + GoabAppHeader, + GoabMicrositeHeader, + GoabOneColumnLayout, + GoabSideMenu, + GoabSideMenuGroup, +} from "@abgov/react-components"; +import "@abgov/style"; + +export function App() { + return ( + +
+ + + +
+
+
+ + + 2152 Icon Custom Alignment + 2331 Block and Tab Dynamic Data + 2393 Popover Not Appearing + 2404 Input Angular Icon Button + 2408 Form Stepper Incomplete Rendering + 2459 File Upload Card TestId + 2473 DatePicker Ordinal Suffixes + 2502 Native Dropdown Height + 2529 Input Width Generation + 2547 Popover Hidden Near Notification + 2655 Dropdown/DatePicker in Modal + 2720 Tabs Change via Link + 2721 Text Tag Margin + 2750 Year Select Sorting + 2768 Enable/Disable Components + 2782 Disabled Inputs Hidden + 2789 Width Rem Measurements + 2821 Table Header Sorting Toggle + 2837 InputNumber Leading/Trailing Content + 2839 Button State After Click + 2849 Filterable Dropdown Keyboard + 2852 Filterable Dropdown Space Key + 2873 Drawer Scrolling Focus + 2878 DatePicker Input onChange + 2892 Input Width Calculations + 2922 Form Stepper Vertical + 2943 Drawer Text Components + 2948 Modal Heading Spacing + 2977 OnChangeDetails Event Missing + 3118 Text Component ID + 3201 Input Component Events + 3215 Drawer Initial Height + 3248 Dropdown Dynamic Children Sync + 3322 App Header Menu Hover + + + 1383 Button Filled Icons + 1547 Tooltip Multiline + 1813 DatePicker Width Properties + 1908 Linear Progress + 2054 MaxWidth Support + 2267 Checkbox List + 2328 Container Height Property + 2361 Radio/Checkbox Clickable Area + 2440 MenuButton Icon + 2492 TextArea onBlur + 2609 Data Table Base Component + 2611 Segmented Tab + 2611 Disabled Tab + 2682 DatePicker Issues + 2722 Input Text-Align + 2730 Temporary Notification Controller + 2829 Modal ARIA Live Region + 2877 Badge Types and Custom Icon + 3102 MenuButton Width + + + A + B + + +
+
+ +
+
+
+ +
+
+ ); +} + +export default App; diff --git a/apps/prs/react/src/assets/.gitkeep b/apps/prs/react/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/prs/react/src/main.tsx b/apps/prs/react/src/main.tsx new file mode 100644 index 0000000000..4ab4406e3c --- /dev/null +++ b/apps/prs/react/src/main.tsx @@ -0,0 +1,133 @@ +import { StrictMode } from "react"; + +import * as ReactDOM from "react-dom/client"; +import { BrowserRouter, Route, Routes } from "react-router-dom"; +import "@abgov/web-components"; +import App from "./app/app"; + +import { Bug2152Route } from "./routes/bugs/bug2152"; +import { Bug2331Route } from "./routes/bugs/bug2331"; +import { Bug2393Route } from "./routes/bugs/bug2393"; +import { Bug2404Route } from "./routes/bugs/bug2404"; +import { Bug2408Route } from "./routes/bugs/bug2408"; +import { Bug2459Route } from "./routes/bugs/bug2459"; +import { Bug2473Route } from "./routes/bugs/bug2473"; +import { Bug2502Route } from "./routes/bugs/bug2502"; +import { Bug2529Route } from "./routes/bugs/bug2529"; +import { Bug2547Route } from "./routes/bugs/bug2547"; +import { Bug2655Route } from "./routes/bugs/bug2655"; +import { Bug2720Route } from "./routes/bugs/bug2720"; +import { Bug2721Route } from "./routes/bugs/bug2721"; +import { Bug2750Route } from "./routes/bugs/bug2750"; +import { Bug2768Route } from "./routes/bugs/bug2768"; +import { Bug2782Route } from "./routes/bugs/bug2782"; +import { Bug2789Route } from "./routes/bugs/bug2789"; +import { Bug2821Route } from "./routes/bugs/bug2821"; +import { Bug2837Route } from "./routes/bugs/bug2837"; +import { Bug2839Route } from "./routes/bugs/bug2839"; +import { Bug2849Route } from "./routes/bugs/bug2849"; +import { Bug2852Route } from "./routes/bugs/bug2852"; +import { Bug2873Route } from "./routes/bugs/bug2873"; +import { Bug2878Route } from "./routes/bugs/bug2878"; +import { Bug2892Route } from "./routes/bugs/bug2892"; +import { Bug2922Route } from "./routes/bugs/bug2922"; +import { Bug2943Route } from "./routes/bugs/bug2943"; +import { Bug2948Route } from "./routes/bugs/bug2948"; +import { Bug2977Route } from "./routes/bugs/bug2977"; +import { Bug3118Route } from "./routes/bugs/bug3118"; +import { Bug3201Route } from "./routes/bugs/bug3201"; +import { Bug3215Route } from "./routes/bugs/bug3215"; +import { Bug3248Route } from "./routes/bugs/bug3248"; +import { Bug3322Route } from "./routes/bugs/bug3322"; + +import { EverythingRoute } from "./routes/everything"; +import { EverythingBRoute } from "./routes/everything-b"; +import Feat1383Route from "./routes/features/feat1383"; +import { Feat1547Route } from "./routes/features/feat1547"; +import { Feat1813Route } from "./routes/features/feat1813"; +import { Feat1908Route } from "./routes/features/feat1908"; +import { Feat2328Route } from "./routes/features/feat2328"; +import { Feat2361Route } from "./routes/features/feat2361"; +import { Feat2054Route } from "./routes/features/feat2054"; +import { Feat2267Route } from "./routes/features/feat2267"; +import { Feat2440Route } from "./routes/features/feat2440"; +import { Feat2492Route } from "./routes/features/feat2492"; +import { Feat2609Route } from "./routes/features/feat2609"; +import Feat2611TabsDisabledRoute from "./routes/features/feat2611-tabs-disabled"; +import { Feat2682Route } from "./routes/features/feat2682"; +import { Feat2722Route } from "./routes/features/feat2722"; +import { Feat2730Route } from "./routes/features/feat2730"; +import { Feat2829Route } from "./routes/features/feat2829"; +import { Feat2877Route } from "./routes/features/feat2877"; +import Feat3102Route from "./routes/features/feat3102"; +import { Feat2611Route } from "./routes/features/feat2611"; + +const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); + +root.render( + + + + } /> + }> + } /> + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + , +); diff --git a/apps/prs/react/src/routes/README.md b/apps/prs/react/src/routes/README.md new file mode 100644 index 0000000000..751fabc34f --- /dev/null +++ b/apps/prs/react/src/routes/README.md @@ -0,0 +1,180 @@ +# Playground Test Routes + +This directory contains test pages for verifying bug fixes and new features before they're merged. + +## Quick Start + +1. Copy `_TEMPLATE.tsx` to the appropriate folder +2. Update the issue details and component name +3. Wire it up in `main.tsx` and `app.tsx` +4. Add your test cases + +## Adding a New Test Page + +### Step 1: Create the route file + +Copy the template to the correct location: + +```bash +# For a bug (e.g., issue #2878) +cp src/routes/_TEMPLATE.tsx src/routes/bugs/bug2878.tsx + +# For a feature (e.g., issue #1547) +cp src/routes/_TEMPLATE.tsx src/routes/features/feat1547.tsx +``` + +### Step 2: Update the route file + +Open your new file and: + +1. **Rename the component** (find/replace `Template` with your issue type+number): + - Bug: `Bug2878Route` + - Feature: `Feat1547Route` + +2. **Update the constants**: + ```tsx + const ISSUE_NUMBER = "2878"; + const ISSUE_TYPE: "bug" | "feature" = "bug"; + const ISSUE_TITLE = "DatePicker onChange Event"; + const ISSUE_DESCRIPTION = ` + The DatePicker component is not firing onChange events when... + `; + ``` + +3. **Add your component imports** and test cases + +### Step 3: Add the import to `main.tsx` + +Add an import statement near the other imports: + +```tsx +// For bugs +import { Bug2878Route } from "./routes/bugs/bug2878"; + +// For features +import { Feat1547Route } from "./routes/features/feat1547"; +``` + +### Step 4: Add the route to `main.tsx` + +Inside the `` component, add your route in the appropriate section: + +```tsx +{/* In the bugs section */} +} /> + +{/* In the features section */} +} /> +``` + +**Note:** Keep routes in numerical order for easy scanning. + +### Step 5: Add navigation to `app.tsx` + +In the `GoabSideMenu`, add a link in the appropriate `GoabSideMenuGroup`: + +```tsx +{/* For bugs - include short descriptive label */} +2878 DatePicker onChange + +{/* For features */} +1547 Tooltip Multiline +``` + +**Navigation label format:** `{NUMBER} {Short Title}` +- Keep titles concise (2-4 words) +- Focus on the component/behavior being tested +- The number allows quick reference to the GitHub issue + +## Checklist + +Use this checklist when adding a new test page: + +- [ ] Created route file in correct folder (`bugs/` or `features/`) +- [ ] Renamed component from `TemplateRoute` to `Bug{N}Route` or `Feat{N}Route` +- [ ] Updated `ISSUE_NUMBER`, `ISSUE_TYPE`, `ISSUE_TITLE` +- [ ] Added issue description from GitHub +- [ ] Added component imports needed for testing +- [ ] Created test cases with clear descriptions +- [ ] Added import to `main.tsx` +- [ ] Added `` to `main.tsx` (in numerical order) +- [ ] Added `` to `app.tsx` side menu with descriptive label +- [ ] Verified page loads at the correct URL +- [ ] Verified navigation link works + +## File Structure + +``` +src/routes/ +├── _TEMPLATE.tsx # Template - copy this for new pages +├── README.md # This file +├── bugs/ +│ ├── bug2152.tsx # Bug test pages +│ ├── bug2331.tsx +│ └── ... +├── features/ +│ ├── feat1547.tsx # Feature test pages +│ ├── feat1813.tsx +│ └── ... +└── everything.tsx # All components showcase +``` + +## Page Structure + +Each test page should include: + +1. **Header** - Issue type, number, and title +2. **GitHub Link** - Direct link to the issue +3. **Issue Description** - Expandable details section with the full issue description +4. **Test Cases** - Individual tests with: + - Descriptive heading + - Explanation of what's being tested + - The actual component(s) + - Expected behavior notes + +## Component Style Guide + +Keep component usage minimal - use semantic tags and let defaults work for you. + +### GoabText - Use `tag` prop only + +After PR #3233, sizes are automatically mapped from the tag: + +```tsx +// Good - minimal, semantic +Page Title // → heading-xl +Section // → heading-l +Subsection // → heading-m +Body text // → body-m + +// Avoid - unnecessary attributes +Title +``` + +### GoabBlock - Use defaults + +The default `gap="m"` works for most cases: + +```tsx +// Good - rely on defaults + + ... + + +// Only specify gap when you need something different + + ... + +``` + +### General principle + +Only add attributes when you need to override the default behavior. + +## Tips + +- **Copy the issue description** from GitHub so reviewers don't need to switch contexts +- **Number your test cases** for easy reference in PR comments +- **Be specific** in test descriptions - "should not show icon when `icon={false}`" is better than "icon test" +- **Test edge cases** - empty states, long content, disabled states, etc. +- **Group related tests** - if testing multiple variants, group them under a subheading diff --git a/apps/prs/react/src/routes/_TEMPLATE.tsx b/apps/prs/react/src/routes/_TEMPLATE.tsx new file mode 100644 index 0000000000..1d9443a572 --- /dev/null +++ b/apps/prs/react/src/routes/_TEMPLATE.tsx @@ -0,0 +1,61 @@ +/** + * PLAYGROUND TEST PAGE TEMPLATE + * + * 1. Copy to: src/routes/bugs/bug{N}.tsx or src/routes/features/feat{N}.tsx + * 2. Rename component: Bug{N}Route or Feat{N}Route + * 3. Update header, GitHub link, and description below + * 4. Add import + route to main.tsx + * 5. Add nav link to app.tsx + * 6. Add your test cases + */ + +import { + GoabBlock, + GoabText, + GoabDivider, + GoabDetails, + GoabLink, + // Add your component imports here +} from "@abgov/react-components"; + +export function TemplateRoute() { + return ( +
+ + Bug #0000: [Short title here] + + + + + + View on GitHub + + + + + + [Paste issue description here. Include expected vs actual behavior.] + + + + + + + Test Cases + + Test 1: [Test name] + + Description of what this test case verifies. + + {/* Add your test component here */} + + Test 2: [Test name] + + Description of what this test case verifies. + + {/* Add your test component here */} +
+ ); +} + +export default TemplateRoute; diff --git a/apps/prs/react/src/routes/bugs/bug2152.tsx b/apps/prs/react/src/routes/bugs/bug2152.tsx new file mode 100644 index 0000000000..ebdce54eb7 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2152.tsx @@ -0,0 +1,209 @@ +import React from "react"; +import { GoabIcon, GoabTooltip } from "@abgov/react-components"; + +export function Bug2152Route() { + return ( +
+

Icons in Tooltip

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

Custom Icons in Tooltip

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

Icon sizes

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

Custom icon sizes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2331.tsx b/apps/prs/react/src/routes/bugs/bug2331.tsx new file mode 100644 index 0000000000..cb1ef84a3d --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2331.tsx @@ -0,0 +1,72 @@ +import React, { useState } from "react"; +import { + GoabBlock, + GoabButton, + GoabTabs, + GoabTab, + GoabText, +} from "@abgov/react-components"; +import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug2331Route() { + const [blockContent, setBlockContent] = useState(null); + const [dynamicTabContent, setDynamicTabContent] = useState(null); + + const addBlockContent = () => { + setBlockContent(`Content updated at ${new Date().toLocaleString()}`); + }; + + const updateDynamicTabContent = () => { + setDynamicTabContent(`Content updated at ${new Date().toLocaleString()}`); + }; + + const onTabsChange = (detail: GoabTabsOnChangeDetail) => { + console.log("Tab changed to", detail.tab); + }; + + return ( +
+ + Bug #2331: Dynamic Data Test + + + + This test demonstrates the dynamic data issue with Block and Tab components. Click + the buttons below to add content dynamically to empty components. + + + {/* Block Component Test */} + + GoabBlock Test + + + Empty Block component + + + {blockContent} + + + Add Content to Block + + + {/* Tabs Component Test */} + + GoabTabs Test + + + Tabs component with one static and one dynamic tab + + + + {dynamicTabContent} + + Static tab content + + + + + Update Dynamic Tab Content + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2393.tsx b/apps/prs/react/src/routes/bugs/bug2393.tsx new file mode 100644 index 0000000000..bac1671d4d --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2393.tsx @@ -0,0 +1,87 @@ +import React from "react"; +import { + GoabTable, + GoabBadge, + GoabPopover, + GoabButton, + GoabTableSortHeader, +} from "@abgov/react-components"; +import { + GoabTableOnSortDetail, + GoabPaginationOnChangeDetail, +} from "@abgov/ui-components-common"; + +export function Bug2393Route() { + function handleClick() { + console.log("Click event"); + } + + function handleSort(event: GoabTableOnSortDetail) { + console.log("Sorting Direction: ", event.sortDir); + console.log("Sorting By: ", event.sortBy); + } + + return ( +
+ + + + + + Claim ID + + + + + Program ID + + + + + Program Name + + + + + Claim Period + + + + + Claim Status + + + Action + + + + + 000001 + 80000225 + MI CASA MONTESSORI LTD. + July 2025 + + + + + + Click me + + } + > + + Claim submission report + + + Educators' submission report + + + + + + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2404.tsx b/apps/prs/react/src/routes/bugs/bug2404.tsx new file mode 100644 index 0000000000..1a1f82f3bf --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2404.tsx @@ -0,0 +1,32 @@ +import { GoabInput } from "@abgov/react-components"; + +export const Bug2404Route = () => { + function noop() { + /* This function intentionally does nothing */ + } + function trailingIconClick() { + console.log("Trailing Icon Clicked"); + } + + return ( +
+ +
+ trailingIconClick()} + /> +
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2408.tsx b/apps/prs/react/src/routes/bugs/bug2408.tsx new file mode 100644 index 0000000000..700bd64e34 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2408.tsx @@ -0,0 +1,123 @@ +import { useState } from "react"; +import { + GoabFormStepper, + GoabFormStep, + GoabBlock, + GoabText, + GoabButton, +} from "@abgov/react-components"; +import { GoabFormStepperOnChangeDetail } from "@abgov/ui-components-common"; + +export const Bug2408Route = () => { + const [currentStep, setCurrentStep] = useState(1); + + const handleStepChange = (details: GoabFormStepperOnChangeDetail) => { + console.log("Step changed:", details); + setCurrentStep(details.step); + }; + + return ( +
+ Bug 2408: Form Stepper "Incomplete" Status Fix + + Testing the fix for Form Stepper where "incomplete" status was being rendered as + "Partially complete" instead of "Incomplete". + + + +
+ Form Stepper with Different Status Types + + This demonstrates the corrected status display for each step status type. + + + + + + + + +
+ +
+ Status Test Controls + + Use these buttons to test different step combinations: + + + + setCurrentStep(1)}> + Step 1 (Complete) + + setCurrentStep(2)}> + Step 2 (Incomplete) + + setCurrentStep(3)}> + Step 3 (Not Started) + + setCurrentStep(4)}> + Step 4 (Not Started) + + +
+ +
+ Test Results + + + Current Step: {currentStep} + + + Expected Status Display: + +
    +
  • + Step 1: Complete (green checkmark) +
  • +
  • + Step 2: Incomplete (red X - was previously showing + "Partially complete") +
  • +
  • + Step 3: Not Started (gray circle - new status type) +
  • +
  • + Step 4: Not Started (gray circle - new status type) +
  • +
+
+
+ +
+ Bug Description + + + Issue: The "incomplete" status was being incorrectly + rendered as "Partially complete" in the Form Stepper component. + + + Fix: Updated the status display logic to properly show + "Incomplete" for the "incomplete" status. + + + Additional: Added new "not-started" status option to + replace "unstarted" for better clarity. + + +
+ +
+ Accessibility Testing + + Screen readers should announce steps in the format: "Step X of Y, Step name: + [Name], Status: [Status]" + + + When clicking step navigation buttons, the screen reader should announce the + step change immediately. + +
+
+
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2459.tsx b/apps/prs/react/src/routes/bugs/bug2459.tsx new file mode 100644 index 0000000000..de89968ee1 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2459.tsx @@ -0,0 +1,106 @@ +import { + GoabFormItem, + GoabFileUploadCard, + GoabFileUploadInput, +} from "@abgov/react-components"; +import { + GoabFileUploadInputOnSelectFileDetail, + GoabFileUploadOnDeleteDetail, + GoabFileUploadOnCancelDetail, +} from "@abgov/ui-components-common"; +import { useState } from "react"; + +export const Bug2459Route = () => { + interface Uploader { + upload: (url: string | ArrayBuffer) => void; + abort: () => void; + } + interface Upload { + file: File; + uploader: Uploader; + } + class MockUploader implements Uploader { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public onprogress: (percent: number) => void = (_: number) => { + /* This function intentionally does nothing */ + }; + public onabort: () => void = () => { + /* This function intentionally does nothing */ + }; + public onfail: (err: string) => void = (_: string) => { + /* This function intentionally does nothing */ + }; + public oncomplete: () => void = () => { + /* This function intentionally does nothing */ + }; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + upload(_url: string | ArrayBuffer) { + // implement your logic to upload files + } + + abort() { + // implement your logic to abort file upload + } + } + + const [uploads, setUploads] = useState([]); + const [progressList, setProgressList] = useState>({}); + + function deleteFile(fileName: string) { + setUploads((uploadz) => { + return uploadz.filter((u) => fileName !== u.file.name); + }); + } + + function uploadFile(file: File) { + const reader = new FileReader(); + reader.onload = (e: ProgressEvent) => { + if (!e.target) return; + const url = e.target.result; + const uploader = new MockUploader(); + + setUploads((old) => [...old, { file, uploader }]); + + uploader.onabort = () => console.log("Aborting upload"); + uploader.onfail = (err) => console.log("Upload failed: ", err); + uploader.oncomplete = () => console.log("File upload complete"); + uploader.onprogress = (percent) => { + setProgressList((old) => ({ ...old, [file.name]: percent })); + }; + + if (url) { + uploader.upload(url); + } + }; + reader.readAsDataURL(file); + } + + return ( +
+ + + uploadFile(event.file) + } + maxFileSize="100MB" + /> + {uploads.map((upload) => ( + + deleteFile(detail.filename) + } + onCancel={(detail: GoabFileUploadOnCancelDetail) => + deleteFile(detail.filename) + } + /> + ))} + +
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2473.tsx b/apps/prs/react/src/routes/bugs/bug2473.tsx new file mode 100644 index 0000000000..188cc301bc --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2473.tsx @@ -0,0 +1,180 @@ +import { useState } from "react"; +import { GoabDatePicker, GoabBlock } from "@abgov/react-components"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug2473Route() { + // Date picker 1: Default value of 1 month in the past + const [datePicker1Value, setDatePicker1Value] = useState(() => { + const oneMonthAgo = new Date(); + oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1); + return oneMonthAgo; + }); + const [datePicker1Display, setDatePicker1Display] = useState(() => + formatDate(datePicker1Value), + ); + + // Date picker 2: Min/max constraints (2 months past to 2 months future) + const [datePicker2Value, setDatePicker2Value] = useState(undefined); + const [datePicker2Display, setDatePicker2Display] = useState("No date selected"); + const [datePicker2Min] = useState(() => { + const twoMonthsAgo = new Date(); + twoMonthsAgo.setMonth(twoMonthsAgo.getMonth() - 2); + return twoMonthsAgo; + }); + const [datePicker2Max] = useState(() => { + const twoMonthsFuture = new Date(); + twoMonthsFuture.setMonth(twoMonthsFuture.getMonth() + 2); + return twoMonthsFuture; + }); + + // Date picker 3: Input type + const [datePicker3Value, setDatePicker3Value] = useState(undefined); + const [datePicker3Display, setDatePicker3Display] = useState("No date selected"); + + const handleDatePicker1Change = (detail: GoabDatePickerOnChangeDetail) => { + const value = detail.value as Date | undefined; + setDatePicker1Value(value); + setDatePicker1Display(formatDate(value)); + }; + + const handleDatePicker2Change = (detail: GoabDatePickerOnChangeDetail) => { + const value = detail.value as Date | undefined; + setDatePicker2Value(value); + setDatePicker2Display(formatDate(value)); + }; + + const handleDatePicker3Change = (detail: GoabDatePickerOnChangeDetail) => { + const value = detail.value as Date | undefined; + setDatePicker3Value(value); + setDatePicker3Display(formatDate(value)); + }; + + function formatDate(date: Date | undefined): string { + if (!date) return "No date selected"; + + // Validate that date is actually a Date object and is valid + if (!(date instanceof Date) || isNaN(date.getTime())) { + return "Invalid date"; + } + + return date.toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + }); + } + + return ( + +

Bug 2473: Date Picker Ordinal Suffix Test

+ +

+ This test page is for manually testing GitHub issue{" "} + + #2473 + + : "Remove ordinal suffixes from date picker display" +

+ +

+ Expected Behavior: Date picker should display dates in the format + "Month Day, Year" without ordinal suffixes (e.g., "July 10, 2025" instead of "July + 10th, 2025") +

+ + {/* Test 1: Date Picker with Default Value (1 month in the past) */} + +

Test 1: Date Picker with Default Value

+

This date picker has a default value set to 1 month in the past:

+ + + + + Selected Value: + {datePicker1Display} + +
+ + {/* Test 2: Date Picker with Min/Max Constraints */} + +

Test 2: Date Picker with Min/Max Constraints

+

+ This date picker has constraints: min = 2 months in the past, max = 2 months in + the future: +

+ + + + + Selected Value: + {datePicker2Display} + +
+ + {/* Test 3: Date Picker with Input Type */} + +

Test 3: Date Picker with Input Type

+

This date picker uses type="input" instead of the default calendar type:

+ + + + + Selected Value: + {datePicker3Display} + +
+ + {/* Expected vs Actual Behavior */} + +

Expected vs Actual Behavior

+ + +

Expected Behavior (After Fix)

+
    +
  • + Date picker displays dates as "Month Day, Year" (e.g., "July 10, 2025") +
  • +
  • No ordinal suffixes (st, nd, rd, th) in the display
  • +
  • Consistent formatting across all date picker types
  • +
  • No impact on date input or validation functionality
  • +
+
+ + +

Actual Behavior (Before Fix)

+
    +
  • + Date picker displays dates with ordinal suffixes (e.g., "July 10th, 2025") +
  • +
  • Inconsistent with desired format
  • +
  • May affect user experience and design consistency
  • +
+
+
+
+ ); +} + +export default Bug2473Route; diff --git a/apps/prs/react/src/routes/bugs/bug2502.tsx b/apps/prs/react/src/routes/bugs/bug2502.tsx new file mode 100644 index 0000000000..c41ba9fcc5 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2502.tsx @@ -0,0 +1,38 @@ +import React from "react"; +import { + GoabBlock, + GoabFormItem, + GoabDropdown, + GoabDropdownItem, +} from "@abgov/react-components"; +import { GoabDropdownOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug2502Route() { + const onDropdownChange = (details: GoabDropdownOnChangeDetail) => { + console.log(`Dropdown ${details.name} selected value:`, details.value); + }; + + return ( +
+

Bug 2502 - Dropdown Test

+ + + + + + + + + + + + + + + + + + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2529.tsx b/apps/prs/react/src/routes/bugs/bug2529.tsx new file mode 100644 index 0000000000..c14d663970 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2529.tsx @@ -0,0 +1,148 @@ +import { GoabInput, GoabFormItem, GoabGrid } from "@abgov/react-components"; +import { useState } from "react"; + +export const Bug2529Route = () => { + const [meridanValue, setMeridanValue] = useState(""); + const [rangeValue, setRangeValue] = useState(""); + const [townshipValue, setTownshipValue] = useState(""); + + return ( +
+

Bug 2529: Input Width Not Being Correctly Generated

+

+ Testing input width issues with grid layout and flex layout as described in GitHub + issue #2529 +

+ +

Test 1: With Grid Component

+
+
+ +
+ + setMeridanValue(detail.value)} + error={true} + /> + +
+
+ + setRangeValue(detail.value)} + /> + +
+
+ + setTownshipValue(detail.value)} + /> + +
+
+
+
+ +

Test 2: Without Grid Component (Flex Layout)

+
+
+
+
+ + setMeridanValue(detail.value)} + width="100%" + error={true} + /> + +
+
+ + setRangeValue(detail.value)} + width="100%" + /> + +
+
+ + setTownshipValue(detail.value)} + width="100%" + /> + +
+
+
+
+ +

Test 3: Individual Input Width Tests

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

Issue Description

+

+ The issue occurs when the goab-input component uses minimum width, + but the input component inside takes up more width than given. This could be + related to the padding property. +

+ +

Expected Behavior

+
    +
  • Input components should respect their container width constraints
  • +
  • + Width for the inner input component should be correct relative to the outer + parent component +
  • +
  • No overflow beyond the allocated container width
  • +
+ +

Current Values

+

+ Meridan: {meridanValue || "Empty"} +

+

+ Range: {rangeValue || "Empty"} +

+

+ Township: {townshipValue || "Empty"} +

+
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2547.tsx b/apps/prs/react/src/routes/bugs/bug2547.tsx new file mode 100644 index 0000000000..fd23c38bd3 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2547.tsx @@ -0,0 +1,70 @@ +import { + GoabButton, + GoabNotification, + GoabPopover, + GoabTooltip, + GoabIcon, + GoabMicrositeHeader, +} from "@abgov/react-components"; + +export const Bug2547Route = () => { + return ( + <> + + + + Angular + + } + padded={false} + > + <> + {["angular", "react"].map((lang) => ( + + {lang} + + ))} + + + + + Click me + + } + > +

This is a popover

+ It can be used for a number of different contexts. +
+ + } + /> + + Notification banner message + + ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2655.tsx b/apps/prs/react/src/routes/bugs/bug2655.tsx new file mode 100644 index 0000000000..05117be54d --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2655.tsx @@ -0,0 +1,82 @@ +import React, { useState } from "react"; +import { + GoabButton, + GoabModal, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, +} from "@abgov/react-components"; + +export function Bug2655Route() { + const [isModalOpen, setIsModalOpen] = useState(false); + + const openModal = () => { + setIsModalOpen(true); + }; + + const closeModal = () => { + setIsModalOpen(false); + }; + + const onDate1Change = (event: any) => { + console.log("Date 1 changed:", event); + }; + + const onDate2Change = (event: any) => { + console.log("Date 2 changed:", event); + }; + + const onDropdown1Change = (event: any) => { + console.log("Dropdown 1 changed:", event); + }; + + const onDropdown2Change = (event: any) => { + console.log("Dropdown 2 changed:", event); + }; + + return ( +
+

Bug 2655 - Modal with Date Pickers and Dropdowns

+

This page tests the integration of modals with form components.

+ + Open Modal + + +
+
+ + + +
+ +
+ + + +
+ +
+ + + + + + + +
+ +
+ + + + + + + +
+
+
+
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2720.tsx b/apps/prs/react/src/routes/bugs/bug2720.tsx new file mode 100644 index 0000000000..6d233b1c88 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2720.tsx @@ -0,0 +1,239 @@ +import { useState } from "react"; +import { + GoabTabs, + GoabTab, + GoabBlock, + GoabText, + GoabButton, + GoabLink, + GoabBadge, +} from "@abgov/react-components"; +import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; + +export const Bug2720Route = () => { + const [currentTab, setCurrentTab] = useState(0); + const [tabChangeLog, setTabChangeLog] = useState([]); + + const handleTabChange = (detail: GoabTabsOnChangeDetail) => { + setCurrentTab(detail.tab); + const logEntry = `Tab changed to: ${detail.tab} (${getTabName(detail.tab)})`; + setTabChangeLog((prev) => [...prev, logEntry]); + console.log("Tab change event:", detail); + }; + + const getTabName = (tabIndex: number): string => { + const tabNames = ["Profile", "Settings", "Help"]; + return tabNames[tabIndex] || `Tab ${tabIndex}`; + }; + + const resetTest = () => { + setTabChangeLog([]); + }; + + // Function to programmatically change URL hash + const changeToTab = (tabIndex: number) => { + const newHash = `tab-${tabIndex}`; + window.location.hash = newHash; + console.log(`Programmatically changed URL to: #${newHash}`); + }; + + // Function to simulate search functionality that switches to first non-empty tab + const simulateSearch = () => { + // Simulate finding results in tab 2 (Settings) + console.log("Search completed - switching to Settings tab (tab 2)"); + changeToTab(2); + }; + + return ( +
+ Bug 2720: Tabs Not Switching via URL Changes + + Testing the tabs component bug where changing the URL hash doesn't switch the + active tab. This should be fixed by PR #2830. + + + +
+ Test Instructions + + Test the following scenarios to verify the tabs component responds to URL + changes: + +
    +
  1. + Direct URL Hash: Click the buttons below to change URL hash +
  2. +
  3. + Link Navigation: Click the links inside the tabs to + navigate to other tabs +
  4. +
  5. + Programmatic Change: Use the "Simulate Search" button to + test programmatic tab switching +
  6. +
  7. + Manual URL: Manually change the URL hash in the browser + address bar +
  8. +
+
+ +
+ Test Controls + + changeToTab(0)}> + Switch to Profile Tab + + changeToTab(1)}> + Switch to Settings Tab + + changeToTab(2)}> + Switch to Help Tab + + + Simulate Search (Switch to Settings) + + + Reset Log + + + + + Current Tab: {currentTab} ({getTabName(currentTab)}) + +
+ +
+ Tabs Component Test + + +
Unread
+
+ +
+ + } + > + + Profile Tab Content + + This is the Profile tab. You can navigate to other tabs using the links + below: + + + + Go to Settings Tab + + + Go to Help Tab + + + + Expected Behavior: Clicking these links should change + the URL and switch the active tab. + + +
+ + + + Settings Tab Content + + This is the Settings tab. You can navigate to other tabs using the links + below: + + + + Go to Profile Tab + + + Go to Help Tab + + + + Expected Behavior: Clicking these links should change + the URL and switch the active tab. + + + + + + + Help Tab Content + + This is the Help tab. You can navigate to other tabs using the links + below: + + + + Go to Profile Tab + + + Go to Settings Tab + + + + Expected Behavior: Clicking these links should change + the URL and switch the active tab. + + + +
+
+ +
+ Tab Change Event Log + {tabChangeLog.length > 0 ? ( +
+ {tabChangeLog.map((log, index) => ( +
+ {log} +
+ ))} +
+ ) : ( +
+ + No tab change events yet. Try changing tabs or using the test controls + above. + +
+ )} +
+ +
+ Expected Behavior (After Fix): +
    +
  • URL hash changes should automatically switch the active tab
  • +
  • Links within tabs should navigate to other tabs
  • +
  • Programmatic URL changes should trigger tab switches
  • +
  • Manual URL hash changes should work
  • +
  • All tab change events should be logged
  • +
+
+ +
+ Bug Description: + + Before the fix, changing the URL hash (via links, programmatic changes, or + manual entry) would update the URL but not switch the active tab. The tabs + component wasn't listening for hash change events. + +
+
+
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2721.tsx b/apps/prs/react/src/routes/bugs/bug2721.tsx new file mode 100644 index 0000000000..29ee2e90dd --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2721.tsx @@ -0,0 +1,93 @@ +import { GoabText, GoabBlock } from "@abgov/react-components"; + +export function Bug2721Route() { + return ( + +

GoabText Margin Bug Test (Issue #2721)

+

+ Testing that changing the "tag" property on GoabText should not change the margin +

+ + {/* Margin Reference Test */} + +

Margin Reference Test

+

Compare margins across different sizes with the same tag:

+
+ + Heading XL (should have L bottom margin, 2XL top margin) + + + Heading L (should have L bottom margin, 2XL top margin) + + + Heading M (should have M bottom margin, 2XL top margin) + + + Heading S (should have S bottom margin, XL top margin) + + + Heading XS (should have XS bottom margin, XL top margin) + + + Body L (should have L bottom margin, 2XL top margin) + + + Body M (should have L bottom margin, L top margin) + + + Body S (should have L bottom margin, L top margin) + + + Body XS (should have L bottom margin, S top margin) + +
+
+ + {/* Tag Consistency Test */} + +

Tag Consistency Test

+

All of these should have identical margins (body-m size):

+
+ + H1 tag with body-m size + + + H2 tag with body-m size + + + H3 tag with body-m size + + + P tag with body-m size + + + Span tag with body-m size + + + Div tag with body-m size + +
+
+ + {/* Expected vs Actual Test */} + +

Expected vs Actual Behavior

+

If the bug is fixed, changing the tag should not affect margins:

+
+

Expected: Same margins regardless of tag

+ + H1 with heading-m (should match below) + + + P with heading-m (should match above) + + + Span with heading-m (should match above) + +
+
+
+ ); +} + +export default Bug2721Route; diff --git a/apps/prs/react/src/routes/bugs/bug2750.tsx b/apps/prs/react/src/routes/bugs/bug2750.tsx new file mode 100644 index 0000000000..8bc732250f --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2750.tsx @@ -0,0 +1,22 @@ +import { GoabFormItem, GoabDatePicker } from "@abgov/react-components"; + +export const Bug2750Route = () => { + const dateToday = new Date(new Date().setFullYear(new Date().getFullYear() + 100)); + const date100YearsAgo = new Date( + new Date().setFullYear(new Date().getFullYear() - 100), + ); + + return ( +
+ + + + + + + + + +
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2768.tsx b/apps/prs/react/src/routes/bugs/bug2768.tsx new file mode 100644 index 0000000000..d3f4fe72a3 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2768.tsx @@ -0,0 +1,112 @@ +import React, { useState } from "react"; +import { + GoabBlock, + GoabButton, + GoabCheckbox, + GoabDatePicker, + GoabDropdown, + GoabFormItem, + GoabInput, + GoabRadioGroup, + GoabRadioItem, + GoabText, + GoabTextArea, +} from "@abgov/react-components"; + +export function Bug2768Route() { + const [checkboxDisabled, setCheckboxDisabled] = useState(true); + const [datePickerDisabled, setDatePickerDisabled] = useState(true); + const [dropdownDisabled, setDropdownDisabled] = useState(true); + const [inputDisabled, setInputDisabled] = useState(true); + const [radioDisabled, setRadioDisabled] = useState(true); + const [textAreaDisabled, setTextAreaDisabled] = useState(true); + + const toggleCheckbox = () => { + setCheckboxDisabled(!checkboxDisabled); + }; + + const toggleDatePicker = () => { + setDatePickerDisabled(!datePickerDisabled); + }; + + const toggleDropdown = () => { + setDropdownDisabled(!dropdownDisabled); + }; + + const toggleInput = () => { + setInputDisabled(!inputDisabled); + }; + + const toggleRadio = () => { + setRadioDisabled(!radioDisabled); + }; + + const toggleTextArea = () => { + setTextAreaDisabled(!textAreaDisabled); + }; + + return ( +
+ + Bug #2769: Enable/Disable Test + + + + This test demonstrates the enable/disable functionality of various form + components. All components start disabled. Click the buttons to enable each + component. + + + {/* Checkbox Test */} + + + + + {checkboxDisabled ? "Enable Checkbox" : "Disable Checkbox"} + + + {/* DatePicker Test */} + + + + + {datePickerDisabled ? "Enable DatePicker" : "Disable DatePicker"} + + + {/* Dropdown Test */} + + + + + {dropdownDisabled ? "Enable Dropdown" : "Disable Dropdown"} + + + {/* Input Test */} + + + + + {inputDisabled ? "Enable Input" : "Disable Input"} + + + {/* Radio Test */} + + + + + + + + {radioDisabled ? "Enable Radio" : "Disable Radio"} + + + {/* TextArea Test */} + + + + + {textAreaDisabled ? "Enable TextArea" : "Disable TextArea"} + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2782.tsx b/apps/prs/react/src/routes/bugs/bug2782.tsx new file mode 100644 index 0000000000..2b49776072 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2782.tsx @@ -0,0 +1,137 @@ +import { GoabInput, GoabBlock, GoabText, GoabFormItem } from "@abgov/react-components"; + +export function Bug2782Route() { + const textValue = + "This is a disabled textarea that should be visible regardless of background color."; + + return ( + +

Disabled Inputs Visibility Bug Test (Issue #2782)

+ + {/* Issue Description */} + +

Issue Description

+

+ According to + + {" "} + GitHub issue #2782 + + , disabled inputs are not visible and get hidden by container backgrounds: +

+
    +
  • + Problem: Disabled inputs are not visible regardless of + background color +
  • +
  • + Expected: Disabled inputs should appear no matter the + background colour +
  • +
  • + Fix: Added z-index: 0 to input container styling in web + components +
  • +
+
+ + {/* Test Instructions */} + +

Test Instructions

+

+ Below are three containers with different background colors, each containing a + disabled GoabTextArea. All disabled textareas should be visible regardless of + the background color. +

+
+ + {/* Test 1: Default Background */} + +

Test 1: Default Background

+

This container uses the default background color:

+ + + + +
+ + {/* Test 2: Dark Grey Background */} +
+ +

Test 2: Dark Grey Background

+

+ This container uses a dark grey background color: +

+ + + + +
+
+ + {/* Test 3: Red Background */} +
+ +

Test 3: Red Background

+

+ This container uses a red background color (as mentioned in the original + issue): +

+ + + + +
+
+ + {/* Expected vs Actual Behavior */} + +

Expected vs Actual Behavior

+ +

Expected Behavior (After Fix)

+
    +
  • + All disabled textareas should be visible regardless of background color +
  • +
  • Disabled textareas should maintain proper contrast and readability
  • +
  • No textareas should be hidden behind container backgrounds
  • +
+
+ + +

Actual Behavior (Before Fix)

+
    +
  • + Disabled textareas were not visible against different background colors +
  • +
  • + Same issue occurred with red background as mentioned in the original report +
  • +
  • Textareas appeared to be hidden by container backgrounds
  • +
+
+
+
+ ); +} + +export default Bug2782Route; diff --git a/apps/prs/react/src/routes/bugs/bug2789.tsx b/apps/prs/react/src/routes/bugs/bug2789.tsx new file mode 100644 index 0000000000..1b7932a2da --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2789.tsx @@ -0,0 +1,158 @@ +import { + GoabInput, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, +} from "@abgov/react-components"; +import { useState } from "react"; + +export const Bug2789Route = () => { + const [inputValue, setInputValue] = useState(""); + const [dropdownValue, setDropdownValue] = useState(""); + + return ( +
+

Bug 2789: Width Units Support (rem, em)

+

Testing support for rem and em width units in Input and Dropdown components

+ +

Input Component Tests

+ + + setInputValue(detail.value)} + width="20rem" + placeholder="Input with 20rem width" + /> + + + + setInputValue(detail.value)} + width="15em" + placeholder="Input with 15em width" + /> + + + + setInputValue(detail.value)} + width="300px" + placeholder="Input with 300px width" + /> + + + + setInputValue(detail.value)} + width="50%" + placeholder="Input with 50% width" + /> + + + + setInputValue(detail.value)} + width="25ch" + placeholder="Input with 25ch width" + /> + + +

Dropdown Component Tests

+ + + setDropdownValue(detail.value || "")} + width="20rem" + placeholder="Dropdown with 20rem width" + > + + + + + + + + + setDropdownValue(detail.value || "")} + width="20em" + placeholder="Dropdown with 20em width" + > + + + + + + + + + setDropdownValue(detail.value || "")} + placeholder="Dropdown with default width" + > + + + + + + + + + setDropdownValue(detail.value || "")} + width="30ch" + placeholder="Dropdown with 30ch width" + > + + + + + + + +

Test Instructions

+
    +
  • + Verify that rem and em width units are properly applied to both Input and + Dropdown components +
  • +
  • + Check that the components resize correctly when the browser font size is changed + (for rem/em units) +
  • +
  • Ensure existing width units (px, %, ch) still work as expected
  • +
  • + Test that dropdown menus open and display correctly with the new width units +
  • +
  • Verify that the width calculations are accurate and consistent
  • +
  • Test that dropdown items are properly displayed and selectable
  • +
+
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2821.tsx b/apps/prs/react/src/routes/bugs/bug2821.tsx new file mode 100644 index 0000000000..e538e2bb4b --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2821.tsx @@ -0,0 +1,182 @@ +import { useState } from "react"; +import { + GoabTable, + GoabTableSortHeader, + GoabBlock, + GoabText, + GoabButton, +} from "@abgov/react-components"; +import { GoabTableOnSortDetail } from "@abgov/ui-components-common"; + +export const Bug2821Route = () => { + const [sortLog, setSortLog] = useState([]); + const [clickCount, setClickCount] = useState(0); + const [sortedData, setSortedData] = useState([ + { id: 1, name: "Alice Johnson", age: 28, department: "Engineering" }, + { id: 2, name: "Bob Smith", age: 32, department: "Marketing" }, + { id: 3, name: "Carol Davis", age: 25, department: "Sales" }, + { id: 4, name: "David Wilson", age: 35, department: "Engineering" }, + { id: 5, name: "Eva Brown", age: 29, department: "HR" }, + ]); + + // Original data for resetting + const originalData = [ + { id: 1, name: "Alice Johnson", age: 28, department: "Engineering" }, + { id: 2, name: "Bob Smith", age: 32, department: "Marketing" }, + { id: 3, name: "Carol Davis", age: 25, department: "Sales" }, + { id: 4, name: "David Wilson", age: 35, department: "Engineering" }, + { id: 5, name: "Eva Brown", age: 29, department: "HR" }, + ]; + + const handleSort = (detail: GoabTableOnSortDetail) => { + const newClickCount = clickCount + 1; + setClickCount(newClickCount); + + const sortDirection = detail.sortDir === 1 ? "ascending" : "descending"; + const logEntry = `Click ${newClickCount}: Sort by "${detail.sortBy}" - ${sortDirection}`; + + setSortLog((prev) => [...prev, logEntry]); + console.log("Sort event:", detail); + + // Sort the data based on the sort event + const sorted = [...originalData].sort((a, b) => { + let aValue: any = a[detail.sortBy as keyof typeof a]; + let bValue: any = b[detail.sortBy as keyof typeof b]; + + // Handle string comparison + if (typeof aValue === "string" && typeof bValue === "string") { + aValue = aValue.toLowerCase(); + bValue = bValue.toLowerCase(); + } + + // Handle number comparison + if (typeof aValue === "number" && typeof bValue === "number") { + return detail.sortDir === 1 ? aValue - bValue : bValue - aValue; + } + + // Handle string comparison + if (aValue < bValue) { + return detail.sortDir === 1 ? -1 : 1; + } + if (aValue > bValue) { + return detail.sortDir === 1 ? 1 : -1; + } + return 0; + }); + + setSortedData(sorted); + }; + + const resetTest = () => { + setSortLog([]); + setClickCount(0); + setSortedData(originalData); + }; + + return ( +
+ Bug 2821: Table Header Sorting Issue + + Testing the table sorting bug where the first two clicks stay ascending before + toggling to descending. + + + +
+ Test Instructions + + Click on any column header multiple times to test the sorting behavior: + +
    +
  1. Click on "Name" header - should show ascending (first click)
  2. +
  3. Click on "Name" header again - should show descending (second click)
  4. +
  5. Click on "Name" header again - should show ascending (third click)
  6. +
  7. + Bug: Currently the first two clicks both show ascending +
  8. +
+
+ +
+ Test Table + + + + + ID + + + Name + + + Age + + + Department + + + + + {sortedData.map((row) => ( + + {row.id} + {row.name} + {row.age} + {row.department} + + ))} + + +
+ +
+ Sort Event Log + + + Reset Test + + Click Count: {clickCount} + + + {sortLog.length > 0 ? ( +
+ {sortLog.map((log, index) => ( +
+ {log} +
+ ))} +
+ ) : ( +
+ + No sort events yet. Click on a column header to start testing. + +
+ )} +
+ +
+ Expected Behavior: +
    +
  • Click 1: ascending (↑)
  • +
  • Click 2: descending (↓)
  • +
  • Click 3: ascending (↑)
  • +
  • Click 4: descending (↓)
  • +
  • And so on...
  • +
+
+
+
+ ); +}; diff --git a/apps/prs/react/src/routes/bugs/bug2837.tsx b/apps/prs/react/src/routes/bugs/bug2837.tsx new file mode 100644 index 0000000000..830420137d --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2837.tsx @@ -0,0 +1,93 @@ +import React from "react"; +import { GoabBlock, GoabText, GoabInput, GoabInputNumber } from "@abgov/react-components"; +import { GoabInputOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug2837Route() { + const handleInputChange = (detail: GoabInputOnChangeDetail) => { + console.log("Input change:", detail); + }; + + const handleNumberInputChange = (detail: GoabInputOnChangeDetail) => { + console.log("Number input change:", detail); + }; + + return ( +
+ + Bug #2837: trailingContent and leadingContent Test + + + + This test demonstrates the issue with trailingContent and leadingContent + properties not working with GoabInputNumber component. All inputs have onChange + handlers that log to console. + + + {/* GoabInput Tests */} + + GoabInput Tests + + + + {/* Test 1: GoabInput with no additional properties */} + + + 1. GoabInput with no additional properties + + + + + {/* Test 2: GoabInput with leadingContent and trailingContent */} + + + 2. GoabInput with leadingContent and trailingContent + + Test} + trailingContent={Test} + onChange={handleInputChange} + /> + + + + {/* GoabInputNumber Tests */} + + GoabInputNumber Tests + + + + {/* Test 3: GoabInputNumber with no additional properties */} + + + 3. GoabInputNumber with no additional properties + + + + + {/* Test 4: GoabInputNumber with leadingContent and trailingContent */} + + + 4. GoabInputNumber with leadingContent and trailingContent + + + + + + + Check the browser console to see the onChange events when you type in the inputs. + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2839.tsx b/apps/prs/react/src/routes/bugs/bug2839.tsx new file mode 100644 index 0000000000..1e1343342b --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2839.tsx @@ -0,0 +1,309 @@ +import { useState } from "react"; +import { + GoabButton, + GoabIconButton, + GoabButtonGroup, + GoabBlock, +} from "@abgov/react-components"; + +export function Bug2839Route() { + const [clickCount, setClickCount] = useState(0); + + const handleButtonClick = () => { + setClickCount((prev) => prev + 1); + console.log(`Button clicked ${clickCount + 1} times`); + }; + + return ( + +

Button State Persistence Bug Test (Issue #2839)

+ + {/* Issue Description */} + +

Issue Description

+

+ According to + + {" "} + GitHub issue #2839 + + , buttons stay in the same state after being clicked: +

+
    +
  • + Problem: When you click a button, it changes state as + expected, but the state remains in effect until you click something else +
  • +
  • + Expected: The state should change back as soon as the mouse + button is released +
  • +
  • + Reported by: Kevin Yu +
  • +
+
+ + {/* Test Instructions */} + +

Test Instructions

+

+ Click each button below and observe if the button state returns to normal + immediately after releasing the mouse button. The button should not remain in a + "pressed" or "active" state after the click is complete. +

+

+ Click Count: {clickCount} +

+
+ + {/* Test 1: Basic Button Types */} + +

Test 1: Basic Button Types

+

Test primary, secondary, and tertiary button types:

+ + + + Primary Button + + + + Secondary Button + + + + Tertiary Button + + +
+ + {/* Test 2: Button Sizes */} + +

Test 2: Button Sizes

+

Test normal and compact button sizes:

+ + + + Normal Size + + + + Compact Size + + +
+ + {/* Test 3: Button Variants */} + +

Test 3: Button Variants

+

Test normal and destructive button variants:

+ + + + Normal Variant + + + + Destructive Variant + + +
+ + {/* Test 4: Buttons with Icons */} + +

Test 4: Buttons with Icons

+

Test buttons with leading and trailing icons:

+ + + + Leading Icon + + + + Trailing Icon + + + + Both Icons + + +
+ + {/* Test 5: Icon Buttons */} + +

Test 5: Icon Buttons

+

Test GoabIconButton components:

+ + + + + + + + + + +
+ + {/* Test 6: Button Groups */} + +

Test 6: Button Groups

+

Test multiple buttons inside GoabButtonGroup:

+ + + + Group Button 1 + + + + Group Button 2 + + + + Group Button 3 + + +
+ + {/* Test 7: Mixed Button Group */} + +

Test 7: Mixed Button Group with Icons

+

Test button group with mixed types and icons:

+ + + + Add Item + + + + Edit + + + + +
+ + {/* Expected vs Actual Behavior */} + +

Expected vs Actual Behavior

+ +

Expected Behavior (After Fix)

+
    +
  • + Button state should return to normal immediately after mouse button release +
  • +
  • No visual indication of "pressed" or "active" state should persist
  • +
  • Focus state should not interfere with mouse interaction states
  • +
  • All button types and variants should behave consistently
  • +
+
+ + +

Actual Behavior (Before Fix)

+
    +
  • Button state remains in "pressed" or "active" state after click
  • +
  • State only changes when clicking something else
  • +
  • Focus state interferes with mouse interaction
  • +
  • Poor user experience with buttons appearing "stuck"
  • +
+
+
+
+ ); +} + +export default Bug2839Route; diff --git a/apps/prs/react/src/routes/bugs/bug2849.tsx b/apps/prs/react/src/routes/bugs/bug2849.tsx new file mode 100644 index 0000000000..8e858a9c5d --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2849.tsx @@ -0,0 +1,164 @@ +import { useState } from "react"; +import { + GoabDropdown, + GoabDropdownItem, + GoabBlock, + GoabText, +} from "@abgov/react-components"; + +export function Bug2849Route() { + const [selectedValue, setSelectedValue] = useState(""); + + const handleDropdownChange = (event: any) => { + setSelectedValue(event.value); + }; + + return ( + +

Filterable Dropdown Keyboard Selection Bug Test (Issue #2849)

+ + {/* Issue Description */} + +

Issue Description

+

+ According to + + {" "} + GitHub issue #2849 + + , the filterable dropdown has keyboard selection issues: +

+
    +
  • + Shift + End: Should select text from cursor to end, but only + moves cursor +
  • +
  • + Shift + Home: Should select text from cursor to beginning, + but only moves cursor +
  • +
+
+ + {/* Test Instructions */} + +

Test Instructions

+ +

Test 1: Shift + End

+
    +
  1. Click on the filterable dropdown below
  2. +
  3. Type some text in the filter input (e.g., "test")
  4. +
  5. Place your cursor at the beginning of the text
  6. +
  7. + Press Shift + End +
  8. +
  9. + Expected: Text should be selected from cursor to end +
  10. +
  11. + Actual: Cursor moves to end but no text is selected +
  12. +
+
+ + +

Test 2: Shift + Home

+
    +
  1. Click on the filterable dropdown below
  2. +
  3. Type some text in the filter input (e.g., "test")
  4. +
  5. Place your cursor at the end of the text
  6. +
  7. + Press Shift + Home +
  8. +
  9. + Expected: Text should be selected from cursor to beginning +
  10. +
  11. + Actual: Cursor moves to beginning but no text is selected +
  12. +
+
+
+ + {/* Test Dropdown */} + +

Test Filterable Dropdown

+

Use this dropdown to test the keyboard selection issues:

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

+ Selected Value: {selectedValue || "None"} +

+
+ + {/* Expected vs Actual Behavior */} + +

Expected vs Actual Behavior

+ +

Expected Behavior

+
    +
  • + Shift + End should select all text from the cursor position to the end of + the input +
  • +
  • + Shift + Home should select all text from the cursor position to the + beginning of the input +
  • +
  • Selected text should be highlighted/visually indicated
  • +
+
+ + +

Actual Behavior (Bug)

+
    +
  • Shift + End only moves the cursor to the end without selecting text
  • +
  • + Shift + Home only moves the cursor to the beginning without selecting text +
  • +
  • + No text selection occurs, making it impossible to select text using these + keyboard shortcuts +
  • +
+
+
+
+ ); +} + +export default Bug2849Route; diff --git a/apps/prs/react/src/routes/bugs/bug2852.tsx b/apps/prs/react/src/routes/bugs/bug2852.tsx new file mode 100644 index 0000000000..d6ffe6ca9b --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2852.tsx @@ -0,0 +1,126 @@ +import React, { useState } from "react"; +import { + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabFormItem, + GoabInput, + GoabText, +} from "@abgov/react-components"; +import { GoabDropdownOnChangeDetail } from "@abgov/ui-components-common"; + +// US State Capitals +const US_CAPITALS = [ + { value: "montgomery", label: "Montgomery" }, + { value: "juneau", label: "Juneau" }, + { value: "phoenix", label: "Phoenix" }, + { value: "Little Rock" }, + { value: "sacramento", label: "Sacramento" }, + { value: "denver", label: "Denver" }, + { value: "hartford", label: "Hartford" }, + { value: "dover", label: "Dover" }, + { value: "tallahassee", label: "Tallahassee" }, + { value: "atlanta", label: "Atlanta" }, + { value: "honolulu", label: "Honolulu" }, + { value: "boise", label: "Boise" }, + { value: "springfield", label: "Springfield" }, + { value: "indianapolis", label: "Indianapolis" }, + { value: "des-moines", label: "Des Moines" }, + { value: "topeka", label: "Topeka" }, + { value: "frankfort", label: "Frankfort" }, + { value: "baton-rouge", label: "Baton Rouge" }, + { value: "augusta", label: "Augusta" }, + { value: "annapolis", label: "Annapolis" }, + { value: "boston", label: "Boston" }, + { value: "lansing", label: "Lansing" }, + { value: "saint-paul", label: "Saint Paul" }, + { value: "jackson", label: "Jackson" }, + { value: "jefferson-city", label: "Jefferson City" }, + { value: "helena", label: "Helena" }, + { value: "lincoln", label: "Lincoln" }, + { value: "carson-city", label: "Carson City" }, + { value: "concord", label: "Concord" }, + { value: "trenton", label: "Trenton" }, + { value: "santa-fe", label: "Santa Fe" }, + { value: "albany", label: "Albany" }, + { value: "raleigh", label: "Raleigh" }, + { value: "bismarck", label: "Bismarck" }, + { value: "columbus", label: "Columbus" }, + { value: "oklahoma-city", label: "Oklahoma City" }, + { value: "salem", label: "Salem" }, + { value: "harrisburg", label: "Harrisburg" }, + { value: "providence", label: "Providence" }, + { value: "columbia", label: "Columbia" }, + { value: "pierre", label: "Pierre" }, + { value: "nashville", label: "Nashville" }, + { value: "austin", label: "Austin" }, + { value: "salt-lake-city", label: "Salt Lake City" }, + { value: "montpelier", label: "Montpelier" }, + { value: "richmond", label: "Richmond" }, + { value: "olympia", label: "Olympia" }, + { value: "charleston", label: "Charleston" }, + { value: "madison", label: "Madison" }, + { value: "cheyenne", label: "Cheyenne" }, +]; + +export function Bug2852Route() { + const [selectedCapital, setSelectedCapital] = useState(""); + + const handleChange = (detail: GoabDropdownOnChangeDetail) => { + console.log("Dropdown changed:", detail); + setSelectedCapital(detail.value || ""); + }; + + return ( +
+ + Bug #2852: FormItem with Filterable Dropdown Test + + + + + {US_CAPITALS.map((capital) => ( + + ))} + + + + Selected Capital:{" "} + {selectedCapital + ? US_CAPITALS.find((c) => c.value === selectedCapital)?.label + : "None"} + + + + + + + {US_CAPITALS.map((capital) => ( + + ))} + + + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2873.tsx b/apps/prs/react/src/routes/bugs/bug2873.tsx new file mode 100644 index 0000000000..eadded292e --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2873.tsx @@ -0,0 +1,144 @@ +import { + GoabAccordion, + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabDetails, + GoabDrawer, + GoabInput, + GoabText, + GoabTextArea, +} from "@abgov/react-components"; +import { useState } from "react"; + +export function Bug2873Route() { + const [rightDrawerOpen, setRightDrawerOpen] = useState(false); + const [bottomDrawerOpen, setBottomDrawerOpen] = useState(false); + + const drawerContent = ( + <> + + + Review notes and long-form content + + + This drawer includes extended content to force scrolling beyond two screen + heights, with interactive elements placed throughout for testing. + + + + Paragraph 1: Review the drawer scroll behavior while reading this extended + narrative that stretches across multiple lines and keeps the content dense enough + to require more scrolling. + + + Paragraph 2: Confirm focus handling and keyboard navigation as you move through + long text blocks in the drawer. + + + Paragraph 3: Continue scanning through the content to ensure the drawer retains + scroll position and keeps focus within the panel. + + + Paragraph 4: Validate that the drawer content continues to flow naturally while + maintaining readable spacing and consistent focus order. + + + + + + Use this details panel to verify expandable content within a long drawer. + + + The panel remains interactive while scrolling, and can be toggled while other + content remains visible. + + + + + + Paragraph 5: Final confirmation text to keep the drawer scrolling beyond two full + screens, ensuring the bottom content is reachable and usable. + + + + + + Expand and collapse this accordion to confirm that layout changes do not jump + the scroll position unexpectedly. + + + Keep the content long enough to require scrolling before and after the + accordion section. + + + + + + Follow-up inputs + + + + + + Additional notes + + + + ); + + return ( +
+ + Bug 2873 - Drawer scroll and interactive content + + Use the buttons below to open the right and bottom drawers. Each drawer shares + the same long content so scrolling, focus, and interactive elements can be + tested consistently. + + + Expected: When scrolling, keep the Details component and Accordion component + near the bottom or the top. Attempt to click them, they should focus and + activate. The bug is currently that it auto scrolls to them but doesn't activate + them. + + + Expected: When using tab navigation, tabbing to the next interactive element in + the Drawer should move the scrolling to that element. + + + + setRightDrawerOpen(true)}> + Open Drawer (Right) + + setBottomDrawerOpen(true)}> + Open Drawer (Bottom) + + + + + setRightDrawerOpen(false)} + > + {drawerContent} + + + setBottomDrawerOpen(false)} + > + {drawerContent} + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2878.tsx b/apps/prs/react/src/routes/bugs/bug2878.tsx new file mode 100644 index 0000000000..4a913af9d9 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2878.tsx @@ -0,0 +1,46 @@ +import React, { useState } from "react"; +import { + GoabBlock, + GoabText, + GoabFormItem, + GoabDatePicker, +} from "@abgov/react-components"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug2878Route() { + const [value1, setValue1] = useState(undefined); + const [value2, setValue2] = useState(undefined); + + const handleChange1 = (detail: GoabDatePickerOnChangeDetail) => { + console.log("Firing Calendar DatePicker"); + setValue1(detail.value as Date); + }; + + const handleChange2 = (detail: GoabDatePickerOnChangeDetail) => { + console.log("Firing Input DatePicker"); + setValue2(detail.value as Date); + }; + + return ( +
+ + Bug #2878: DatePicker onChange and type="input" Test + + + + + + Value: {String(value1 ?? "")} + + + + Value: {String(value2 ?? "")} + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2892.tsx b/apps/prs/react/src/routes/bugs/bug2892.tsx new file mode 100644 index 0000000000..bb81a579fd --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2892.tsx @@ -0,0 +1,231 @@ +import React from "react"; +import { GoabBlock, GoabText, GoabInput, GoabFormItem } from "@abgov/react-components"; +import { GoabInputOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug2892Route() { + const handleInputChange = (detail: GoabInputOnChangeDetail) => { + console.log("Input change:", detail); + }; + + return ( +
+ + Bug #2892: Width Measurements Test + + + + This test demonstrates various width measurements (ch, px, rem, %) on GoabInput + components. All inputs have onChange handlers that log to console. The bug affects + character width calculations. + + + {/* Character (ch) Width Tests */} + + Character (ch) Width Tests + + + + + + + + + + + + + + + + + + + + + {/* Pixel (px) Width Tests */} + + Pixel (px) Width Tests + + + + + + + + + + + + + + + + + + + + + {/* Rem Width Tests */} + + Rem Width Tests + + + + + + + + + + + + + + + + + + + + + {/* Percentage (%) Width Tests */} + + Percentage (%) Width Tests + + + + + + + + + + + + + + + + + + + + + {/* Default Width Test (no width specified) */} + + Default Width Test + + + + + + + + + + Check the browser console to see the onChange events when you type in the inputs. + Notice how character (ch) width inputs behave differently from other units. + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2922.tsx b/apps/prs/react/src/routes/bugs/bug2922.tsx new file mode 100644 index 0000000000..5b3e8c93de --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2922.tsx @@ -0,0 +1,45 @@ +import React, { useState } from "react"; +import { GoabFormStepper, GoabFormStep } from "@abgov/react-components"; +import { GoabFormStepperOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug2922Route() { + const [currentStep, setCurrentStep] = useState(1); + + const handleStepperChange = (detail: GoabFormStepperOnChangeDetail) => { + console.log("Form stepper change:", detail); + setCurrentStep(detail.step); + }; + + return ( +
+

Bug #2922: Form Stepper Test

+ +

+ This test demonstrates GoabFormStepper components with 5 GoabFormStep components + each. +

+ + {/* Constrained width stepper (500px) */} +
+

Constrained Width Stepper (500px)

+ + + + + + + +
+ + {/* Full width stepper */} +

Full Width Stepper

+ + + + + + + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2943.tsx b/apps/prs/react/src/routes/bugs/bug2943.tsx new file mode 100644 index 0000000000..e49487bbdc --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2943.tsx @@ -0,0 +1,118 @@ +import { useState, JSX } from "react"; +import { + GoabBlock, + GoabButton, + GoabDrawer, + GoabFormItem, + GoabGrid, + GoabInput, + GoabText, +} from "@abgov/react-components"; + +export function Bug2943Route(): JSX.Element { + const [bottomOpen, setBottomOpen] = useState(false); + const [sideOpen, setSideOpen] = useState(false); + + return ( + + bug2943 - Drawer sizing and content interactions + + Use the buttons below to open drawers anchored to the bottom and side. Each drawer + contains enough content to highlight overflow, inputs, and nested actions. + + + + + Bottom drawer scenario + + Opens a medium-height drawer from the bottom with form content so it reaches + roughly half the viewport. + + setBottomOpen(true)}>Open bottom drawer + + setBottomOpen(false)} + > + + + + + + Add steps, notes, or instructions here. The block content encourages + scrolling if the screen height is short. + + + + + + Use this area to capture any additional details needed to reproduce the + experience. The drawer height should adjust while leaving the backdrop + visible. + + + Provide checklist items, validation notes, or follow-up actions to + exercise the space and confirm scroll behaviour when content grows. + + setBottomOpen(false)}> + Finish and close + + + + + + + Side drawer scenario + + Opens from the right and contains multiple sections to force vertical + scrolling. + + setSideOpen(true)}>Open side drawer + + setSideOpen(false)} + > + + + + + + Provide a longer description to ensure the drawer needs to scroll. Each + paragraph adds context for the tester. + + + Additional paragraph to stretch the layout and highlight scroll shadows. + Repeat content with slight variations to mimic real instructions. + + + + + + Checklist: confirm header, close button, and backdrop interactions behave + correctly when scrolling through dense content within the drawer. + + + + + + Final copy block to ensure the drawer consumes the available height and + requires scroll. + + Save changes + + + + + + ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2948.tsx b/apps/prs/react/src/routes/bugs/bug2948.tsx new file mode 100644 index 0000000000..c7444aaaa5 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2948.tsx @@ -0,0 +1,153 @@ +import React, { useState } from "react"; +import { + GoabModal, + GoabButton, + GoabButtonGroup, + GoabBlock, +} from "@abgov/react-components"; + +export function Bug2948Route() { + // Modal 1: String heading + const [modal1Open, setModal1Open] = useState(false); + + // Modal 2: ReactNode heading and content + const [modal2Open, setModal2Open] = useState(false); + + // Modal 3: Empty heading and actions + const [modal3Open, setModal3Open] = useState(false); + + // Modal 4: ReactNode heading and actions with ButtonGroup + const [modal4Open, setModal4Open] = useState(false); + + const openModal1 = () => setModal1Open(true); + const openModal2 = () => setModal2Open(true); + const openModal3 = () => setModal3Open(true); + const openModal4 = () => setModal4Open(true); + + const closeModal1 = () => setModal1Open(false); + const closeModal2 = () => setModal2Open(false); + const closeModal3 = () => setModal3Open(false); + const closeModal4 = () => setModal4Open(false); + + return ( + <> +

Bug 2948 - Modal Testing

+

+ Testing different GoabModal configurations with various heading and action + patterns. +

+ + +

Modal 1: String Heading

+

+ This modal uses a simple string heading and can be closed with the close button + or backdrop. +

+ + Open Modal 1 + + +

Modal 2: ReactNode Heading and Content

+

+ This modal uses ReactNode for both heading and content, allowing for rich HTML + content. +

+ + Open Modal 2 + + +

Modal 3: Empty Heading and Actions

+

+ This modal has no heading and no actions, demonstrating minimal configuration. +

+ + Open Modal 3 + + +

Modal 4: ReactNode Heading with ButtonGroup Actions

+

+ This modal uses ReactNode for heading and contains a ButtonGroup with two + buttons in the actions slot. +

+ + Open Modal 4 + +
+ + {/* Modal 1: String heading */} + +

+ This is modal 1 with a simple string heading. It can be closed by clicking the + close button or clicking outside the modal. +

+

+ The heading is set using the heading property with a string value. +

+
+ + {/* Modal 2: ReactNode heading and content */} + + Rich Content Modal +
+ } + > +
+

Welcome to Modal 2!

+

+ This modal demonstrates using ReactNode for both the heading and + content. +

+ +

This provides maximum flexibility for custom modal designs.

+
+ + + {/* Modal 3: Empty heading and actions */} + +

This is modal 3 with an empty heading and no actions.

+

It demonstrates the minimal modal configuration possible.

+

The modal can only be closed using the close button or backdrop click.

+
+ + {/* Modal 4: ReactNode heading with ButtonGroup actions */} + + + Cancel + + + Confirm + + + } + > +
+

This is modal 4 with a custom heading and action buttons.

+

+ The actions are implemented using a GoabButtonGroup with two + buttons. +

+

+ This pattern is commonly used for confirmation dialogs and form submissions. +

+
+
+ + ); +} diff --git a/apps/prs/react/src/routes/bugs/bug2977.tsx b/apps/prs/react/src/routes/bugs/bug2977.tsx new file mode 100644 index 0000000000..c8e0210f31 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug2977.tsx @@ -0,0 +1,199 @@ +import { + GoabCheckbox, + GoabCheckboxList, + GoabDatePicker, + GoabDropdown, + GoabDropdownItem, + GoabFileUploadInput, + GoabInput, + GoabRadioGroup, + GoabRadioItem, + GoabTabs, + GoabTab, + GoabTextArea, + GoabFormItem, + GoabText, + GoabAccordion, +} from "@abgov/react-components"; +import { + GoabCheckboxListOnChangeDetail, + GoabCheckboxOnChangeDetail, + GoabDatePickerOnChangeDetail, + GoabDropdownOnChangeDetail, + GoabFileUploadInputOnSelectFileDetail, + GoabInputOnBlurDetail, + GoabInputOnChangeDetail, + GoabInputOnFocusDetail, + GoabInputOnKeyPressDetail, + GoabRadioGroupOnChangeDetail, + GoabTabsOnChangeDetail, + GoabTextAreaOnBlurDetail, + GoabTextAreaOnChangeDetail, + GoabTextAreaOnKeyPressDetail, +} from "@abgov/ui-components-common"; + +export function Bug2977Route() { + const logEvent = (label: string, detail: unknown) => { + console.log(label, detail); + }; + + const handleInputChange = (detail: GoabInputOnChangeDetail) => { + logEvent("input change", detail); + detail.event?.stopPropagation(); + }; + + const handleInputFocus = (detail: GoabInputOnFocusDetail) => + logEvent("input focus", detail); + const handleInputBlur = (detail: GoabInputOnBlurDetail) => + logEvent("input blur", detail); + const handleInputKeyPress = (detail: GoabInputOnKeyPressDetail) => { + logEvent("input keypress", detail); + detail.event?.stopPropagation(); + }; + + const handleCheckboxChange = (detail: GoabCheckboxOnChangeDetail) => + logEvent("checkbox change", detail); + + const handleCheckboxListChange = (detail: GoabCheckboxListOnChangeDetail) => { + logEvent("checkbox list change", detail); + }; + + const handleDatePickerChange = (detail: GoabDatePickerOnChangeDetail) => + logEvent("date picker change", detail); + + const handleDropdownChange = (detail: GoabDropdownOnChangeDetail) => + logEvent("dropdown change", detail); + + const handleFileSelect = (detail: GoabFileUploadInputOnSelectFileDetail) => + logEvent("file upload select", detail); + + const handleRadioGroupChange = (detail: GoabRadioGroupOnChangeDetail) => + logEvent("radio group change", detail); + + const handleTextareaChange = (detail: GoabTextAreaOnChangeDetail) => + logEvent("textarea change", detail); + const handleTextareaKeyPress = (detail: GoabTextAreaOnKeyPressDetail) => + logEvent("textarea keypress", detail); + const handleTextareaBlur = (detail: GoabTextAreaOnBlurDetail) => + logEvent("textarea blur", detail); + + const handleTabsChange = (detail: GoabTabsOnChangeDetail) => + logEvent("tabs change", detail); + + const handleTabInputOne = (detail: GoabInputOnChangeDetail) => { + detail.event?.stopPropagation(); + logEvent("tab 1 input change (stopPropagation)", detail); + }; + + const handleTabInputTwo = (detail: GoabInputOnChangeDetail) => + logEvent("tab 2 input change", detail); + const handleTabInputThree = (detail: GoabInputOnChangeDetail) => + logEvent("tab 3 input change", detail); + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Testing #2977 Issue + + Tab 1 input should not fire the Tab onChange. Tab 2 and 3 will fire the Tab + onChange. + + + + Type here to confirm onChange can stop bubbling. + + + + Type here to see bubbling continue. + + + + Type here to see bubbling continue. + + + +
+ ); +} + +export default Bug2977Route; diff --git a/apps/prs/react/src/routes/bugs/bug3118.tsx b/apps/prs/react/src/routes/bugs/bug3118.tsx new file mode 100644 index 0000000000..da32415413 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3118.tsx @@ -0,0 +1,148 @@ +import { + GoabBlock, + GoabDivider, + GoabGrid, + GoabMenuAction, + GoabMenuButton, + GoabText, +} from "@abgov/react-components"; +import type { GoabMenuButtonOnActionDetail } from "@abgov/ui-components-common"; + +export function Bug3118Route() { + const onAction = (detail: GoabMenuButtonOnActionDetail) => { + console.log(detail); + }; + + return ( + + + + + 3118 + {" "} + - MenuButton's width is not setting the correct width on wider elements + + + Use these scenarios to confirm the React wrapper exposes the leading icon + property and that the menu width matches the longest action label. + + + + + + {/* Critical Test Cases for the Fix */} + Long Elements aren't forced to wrap + + + + + + + + {/* Critical Test Cases for the Fix */} + Max width can be set forcing long elements to wrap + + + + + + + + + + {/* Critical Test Cases for the + + + {/* Critical Test Cases for the Fix */} + + Components on the right side of the screen will right align the menu options + + You may may have to resize the browser to test this + + +
+ + + + + +
+ + + + {/* */} + Regression tests + + + + Some text + + + + + + + + + + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dicta earum ipsa + ullam beatae at atque non voluptas fugiat sapiente praesentium quisquam + possimus repellat, illo voluptates nisi obcaecati quos. Mollitia, recusandae. + + + + + + + + + + + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dicta earum ipsa + ullam beatae at atque non voluptas fugiat sapiente praesentium quisquam + possimus repellat, illo voluptates nisi obcaecati quos. Mollitia, recusandae. + + + + + + + + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug3201.tsx b/apps/prs/react/src/routes/bugs/bug3201.tsx new file mode 100644 index 0000000000..57364278c5 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3201.tsx @@ -0,0 +1,118 @@ +import { + GoabText, + GoabFormItem, + GoabTextarea, + GoabInput, + GoabButton, + GoabButtonGroup, +} from "@abgov/react-components"; +import { + GoabInputOnChangeDetail, + GoabInputOnBlurDetail, + GoabTextAreaOnChangeDetail, + GoabTextAreaOnBlurDetail, +} from "@abgov/ui-components-common"; +import { useState } from "react"; + +export function Bug3201Route() { + const [inputValue, setInputValue] = useState(""); + const [textAreaValue, setTextAreaValue] = useState(""); + const [inputChange, setInputChange] = useState(""); + const [inputBlur, setInputBlur] = useState(""); + const [areaChange, setAreaChange] = useState(""); + const [areaBlur, setAreaBlur] = useState(""); + + function handleInputChange(detail: GoabInputOnChangeDetail) { + setInputValue(detail.value); + setInputChange("Input Change event fired"); + setTimeout(() => { + setInputChange(""); + }, 500); + console.log("Input change event fired"); + } + + function handleInputBlur(detail: GoabInputOnBlurDetail) { + setInputValue(detail.value); + setInputBlur("Input Blur event fired"); + setTimeout(() => { + setInputBlur(""); + }, 500); + console.log("Input blur event fired"); + } + + function handleAreaChange(detail: GoabTextAreaOnChangeDetail) { + setTextAreaValue(detail.value); + setAreaChange("Text Area Change event fired"); + setTimeout(() => { + setAreaChange(""); + }, 500); + console.log("Text Area change event fired"); + } + + function handleAreaBlur(detail: GoabTextAreaOnBlurDetail) { + setTextAreaValue(detail.value); + setAreaBlur("Text Area Blur event fired"); + setTimeout(() => { + setAreaBlur(""); + }, 500); + console.log("Text area blur event fired"); + } + + function addInputText() { + setInputValue("Different"); + } + + function addTextAreaText() { + setTextAreaValue("This is some new text added to the text area"); + } + + return ( +
+ + #3201: Modify GoabInput onChange to not fire on tab + + + This is to test the GoabInput and GoabTextArea components. Specifically the + onChange event, it should only fire when a change is detected inside the + component. It should not fire when you tab out of the component. + + + You can see the events fire in the UI for 500ms, or you can check the console log. + + + handleAreaChange(e)} + onBlur={(e) => handleAreaBlur(e)} + width="100%" + value={textAreaValue} + /> + +
+ Change: {areaChange} || Blur: {areaBlur} +
+ + handleInputChange(e)} + onBlur={(e) => handleInputBlur(e)} + width="100%" + value={inputValue} + /> + +
+ Change: {inputChange} || Blur: {inputBlur} +
+ + The buttons below will add text to each component. No change event should be + fired. + + + addInputText()}>Add Input Text + addTextAreaText()}>Add + +
+ ); +} + +export default Bug3201Route; diff --git a/apps/prs/react/src/routes/bugs/bug3215.tsx b/apps/prs/react/src/routes/bugs/bug3215.tsx new file mode 100644 index 0000000000..b1c5adaf3a --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3215.tsx @@ -0,0 +1,129 @@ +import { + GoabButton, + GoabButtonGroup, + GoabText, + GoabDrawer, +} from "@abgov/react-components"; +import { useState } from "react"; + +export function Bug3215Route() { + const [rightDrawerOpen, setRightDrawerOpen] = useState(false); + const [bottomDrawerOpen, setBottomDrawerOpen] = useState(false); + + const drawerActionsRight = ( + + closeRightDrawer()}> + Cancel + + closeRightDrawer()}> + Save + + + ); + + const drawerActionsBottom = ( + + closeBottomDrawer()}> + Cancel + + closeBottomDrawer()}> + Save + + + ); + + const drawerContent = ( +
+

+ Use the buttons below to close this right-positioned drawer. The content area + stretches to fill the available vertical space for layout testing. +

+ Review checklist +
    +
  • Confirm scope alignment
  • +
  • Validate stakeholder sign-offs
  • +
  • Verify accessibility and QA coverage
  • +
+

+ This panel expands to the full viewport height so you can test scrolling and + layout behavior. Add or remove content here to simulate different drawer payloads. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, + dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, + dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, + dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, + dolor. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, + dolor. +

+
+ ); + + const openRightDrawer = () => { + setRightDrawerOpen(true); + }; + + const openBottomDrawer = () => { + setBottomDrawerOpen(true); + }; + + const closeRightDrawer = () => { + setRightDrawerOpen(false); + }; + + const closeBottomDrawer = () => { + setBottomDrawerOpen(false); + }; + + return ( +
+ + openRightDrawer()}> + Open Drawer (Right) + + openBottomDrawer()}> + Open Drawer (Bottom) + + + + closeRightDrawer()} + > + {drawerContent} + + + closeBottomDrawer()} + > + {drawerContent} + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug3248.tsx b/apps/prs/react/src/routes/bugs/bug3248.tsx new file mode 100644 index 0000000000..ae9d04ddf4 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3248.tsx @@ -0,0 +1,103 @@ +import React, { useState } from "react"; +import { + GoabButton, + GoabDropdown, + GoabDropdownItem, + GoabText, +} from "@abgov/react-components"; +import { GoabDropdownOnChangeDetail } from "@abgov/ui-components-common"; + +export function Bug3248Route() { + const [colors, setColors] = useState(["red", "blue", "green", "yellow", "purple"]); + const [selectedColor, setSelectedColor] = useState(""); + + const reduceToOne = () => { + setColors(["blue"]); + }; + + const reduceToTwo = () => { + setColors(["green", "yellow"]); + }; + + const resetToAll = () => { + setColors(["red", "blue", "green", "yellow", "purple"]); + }; + + const onChange = (detail: GoabDropdownOnChangeDetail) => { + console.log("Dropdown changed:", detail); + setSelectedColor(detail.value || ""); + }; + + return ( +
+ + Bug #2333: Dropdown Reset Test + + + + This test demonstrates the dropdown reset issue. When dropdown items are dynamically + removed, the dropdown should properly sync its internal state to reflect the updated + list of options. + + + + Test Scenario + + + + 1. Select a color from the dropdown below + + + 2. Click one of the buttons to reduce the number of available options + + + 3. Open the dropdown again - it should only show the remaining options + + + 4. The bug occurred when the filtered options weren't synced after items were destroyed + + + + Currently showing {colors.length} color(s): {colors.join(", ")} + + + + Selected value: {selectedColor || "None"} + + + + {colors.map((color) => ( + + ))} + + +
+ + Reduce to 1 item (blue) + + + Reduce to 2 items (green, yellow) + + + Reset to all items + +
+ + + Expected behavior: After clicking a reduction button, opening the + dropdown should only display the items that remain in the list. + + + Bug behavior (before fix): The dropdown would still show all original + items even after they were removed, because syncFilteredOptions() wasn't called when + child items were destroyed. + +
+ ); +} diff --git a/apps/prs/react/src/routes/bugs/bug3322.tsx b/apps/prs/react/src/routes/bugs/bug3322.tsx new file mode 100644 index 0000000000..c2c2634997 --- /dev/null +++ b/apps/prs/react/src/routes/bugs/bug3322.tsx @@ -0,0 +1,26 @@ +import { + GoabAppHeader, + GoabAppHeaderMenu, + GoabPageBlock, +} from "@abgov/react-components"; + +export function Bug3322Route() { + return ( + <> +

Bug 3322 - App Header Menu Display

+

Testing that app header menu displays correctly on hover.

+ + + + + Cases + Payments + Outstanding + + Support + Sign in + + + + ); +} diff --git a/apps/prs/react/src/routes/everything-b.tsx b/apps/prs/react/src/routes/everything-b.tsx new file mode 100644 index 0000000000..5624cfc2f3 --- /dev/null +++ b/apps/prs/react/src/routes/everything-b.tsx @@ -0,0 +1,6113 @@ +import React, { useState } from "react"; +import { Link, Outlet } from "react-router-dom"; +import { + GoabAppFooter, + GoabAppHeader, + GoabMicrositeHeader, + GoabOneColumnLayout, + GoabSideMenu, + GoabSideMenuGroup, + GoabPageBlock, + GoabFormItem, + GoabRadioGroup, + GoabRadioItem, + GoabButton, + GoabSpacer, + GoabDropdown, + GoabDropdownItem, + GoabInput, + GoabBlock, + GoabDatePicker, + GoabTooltip, + GoabIcon, + GoabBadge, + GoabText, + GoabModal, + GoabButtonGroup, + GoabTextarea, + GoabTabs, + GoabTab, + GoabDivider, + GoabIconButton, + GoabCircularProgress, + GoabContainer, + GoabDetails, + GoabHeroBanner, + GoabHeroBannerActions, + GoabNotification, + GoabAppFooterMetaSection, + GoabAppFooterNavSection, + GoabFileUploadInput, + GoabFileUploadCard, + GoabSideMenuHeading, + GoabAccordion, + GoabSkeleton, + GoabCheckbox, + GoabFormStep, + GoabFormStepper, + GoabPages, + GoabCallout, + GoabPopover, + GoabAppHeaderMenu, + GoabTable, + GoabTableSortHeader, + GoabGrid, +} from "@abgov/react-components"; +import "@abgov/style"; +import { + GoabDropdownOnChangeDetail, + GoabInputOnChangeDetail, + GoabSkeletonSize, + GoabTextAreaOnChangeDetail, +} from "@abgov/ui-components-common"; + +function onChange(tabIndex: number): void { + console.log("Tab changed to ", tabIndex); +} + +function inputOnChange() { + void 0; +} +export function EverythingBRoute() { + // hooks + const [destructiveModalOpen, setDestructiveModalOpen] = useState(); + const [basicModalOpen, setBasicModalOpen] = useState(); + const [basicModal2Open, setBasicModal2Open] = useState(); + const [basicModal3Open, setBasicModal3Open] = useState(); + const [contentModalOpen, setContentModalOpen] = useState(); + const [contentModalScrollOpen, setContentModalScrollOpen] = useState(); + const [contentModal2Open, setContentModal2Open] = useState(); + const [NoHeaderModalOpen, setNoHeaderModalOpen] = useState(); + const [step, setStep] = useState(-1); + const [step2, setStep2] = useState(-1); + // eslint-disable-next-line @typescript-eslint/no-empty-function + const noop = () => {}; + // Snackbar states + const [snackbarVisible, setSnackbarVisible] = useState< + | false + | "basic" + | "basic-plus" + | "basic-plus-button" + | "success" + | "failure" + | "loading" + >(false); + const [snackbarKey, setSnackbarKey] = useState(0); + + function radio1(name: string, value: string) { + console.log("onChange", name, value); + } + + function radio2(name: string, value: string) { + console.log("onChange", name, value); + } + + function radio3(name: string, value: string) { + console.log("onChange", name, value); + } + + const popovertarget = ( + + Click me + + ); + const [value, setValue] = useState(""); + + function onChangeDropdown(detail: GoabDropdownOnChangeDetail) { + setValue(detail.value as string); + } + + function onChangeTextArea(detail: GoabTextAreaOnChangeDetail) { + console.log(detail.value); + } + + interface User { + firstName: string; + lastName: string; + age: number; + } + + const [users, setUsers] = useState([]); + const [open, setOpen] = useState(false); + const [openNoActions, setOpenNoActions] = useState(false); + const [position, setPosition] = useState("left"); + const [dateTaken, setDateTaken] = useState("today"); + const [hasActionsSlot, setActionsSlot] = useState("y"); + + function openDrawer() { + if (hasActionsSlot === "n") { + setOpenNoActions(true); + } else { + setOpen(true); + } + } + + const _users: User[] = [ + { + firstName: "Christian", + lastName: "Batz", + age: 18, + }, + { + firstName: "Brain", + lastName: "Wisozk", + age: 19, + }, + { + firstName: "Neha", + lastName: "Jones", + age: 23, + }, + { + firstName: "Tristin", + lastName: "Buckridge", + age: 31, + }, + ]; + React.useEffect(() => { + setUsers(_users); + }, []); + + function sortData(sortBy: string, sortDir: number) { + const _users = [...users]; + _users.sort((a: any, b: any) => { + return (a[sortBy] > b[sortBy] ? 1 : -1) * sortDir; + }); + setUsers(_users); + } + + const containeractions = ( + + + + Edit + + + ); + + const containeractionsinverse = ( + + + + Edit + + + ); + + return ( + +
+ + + + +
+ + {/* Back link after first header */} +
+ + + Back to main playground + + +
+ +
+ + + + Category 1 + + Cases + Payments + Outstanding + Another + Secondary item + + Another + Another + Another + Another + + Sign in + + + + + Menu item + Menu item + Menu item + + My profile + Settings + + Sign out + + + + + + sdsa + + + Menu item + Payments + Outstanding + Another + Another + + Support + + Menu item + Payments + Outstanding + Another + Another + + Another + + + Sign in + + + + + + Cases + Payments + Outstanding + Another + Another + + + + Sign in + + + + + + Sign in + + + + + Support + Another + Another + + Sign in + + + + +
+ + {/* Main page content here */} +
+ + + + onChange(detail.tab)}> + + + + + + {/* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Components + + } + > + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Badge + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Button + + + + + Primary + Secondary + Tertiary + + + + Primary + + Secondary + + + Tertiary + + + + + Primary + + Secondary + + + Tertiary + + + + + Compact primary + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + Destructive primary + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + Start + + + + Inverse (experimental) + + + + Regular primary + Regular secondary + Regular tertiary + + +
+ + Inverse primary + + Inverse secondary + + + Inverse tertiary + + +
+ + + Disabled + + + + Primary + + Secondary + + + Tertiary + + + + + + Primary + + + Secondary + + + Tertiary + + + + + + Primary + + + Secondary + + + Tertiary + + + + + + Cmpact primary + + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + + Compact primary + + + Compact secondary + + + Compact tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Destructive primary + + + Destructive secondary + + + Destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Compact destructive primary + + + Compact destructive secondary + + + Compact destructive tertiary + + + + + + Disabled start + + +
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Button group + + + + + Default + Button + Group + + + + Compact + + Button + + + Group + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Callout + + + + + Callout important information for the user. + + + + You will receive a copy of the confirmation to the email + name@email.com + + + Your reference number is: 1234ABC + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Checkbox + + + + + + + + Help text with a link. + + } + > + + + Help text with a link. + + } + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Container + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Interactive with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Interactive filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Info with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Info with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Info filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Error with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Error with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Error filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Success with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Success with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Success filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Important with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Important with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Important filled + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive, compact with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive, compact with accent + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + Non-interactive, compact + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at + risus et magna interdum vestibulum in at ligula. + + + + + + + Button + + + + + + Question + + + Answer + + + + Confirm + Back to task list + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Date picker + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Detail + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vel + lacinia metus, sed sodales lectus. Aliquam sed volutpat velit. + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vel + lacinia metus, sed sodales lectus. Aliquam sed volutpat velit. + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Divider + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Dropdown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + File upload + + + + + { + /* do nothing */ + }} + /> + + + + { + /** do nothing **/ + }} + /> + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Form item + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + /** do nothing **/ + }} + /> + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Form stepper + + + + setStep(e.step)}> + + + + + + +
Page 1 content
+
Page 2 content
+
Page 3 content
+
Page 4 content
+
+ + setStep2(e.step)}> + + + + + + + +
Page 1 content
+
Page 2 content
+
Page 3 content
+
Page 4 content
+
Page 5 content
+
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Hero Banner + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + Resources are available to help Alberta entrepreneurs and small + businesses start, grow and succeed. + + Call to action + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Icon + + + + + Tshirt sizing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Number sizing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Inverted + +
+ + + + + + +
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Icon button + + + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + +
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + Input + + + + + + + + + This is slotted help text. + + } + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Link + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Microsite header + + + + + + + + + + + Feedback link + + + + + + + + + + Version number + + + + + + + + + + Feedback link and Version number + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Modal + + + + setDestructiveModalOpen(true)} + > + Delete my application + + + + setDestructiveModalOpen(false)} + > + Cancel + + { + setDestructiveModalOpen(false); + }} + > + Delete application + + + } + > +

This action cannot be undone.

+
+ + setBasicModalOpen(true)}> + Open basic modal with close + + + setBasicModalOpen(false)} + > +

+ This is meant to be dismissed, the user can click outside of the + modal or click the close button in the top right corner. +

+
+ + setBasicModal2Open(true)}> + Open basic modal with actions + + + + setBasicModal2Open(false)} + > + Cancel + + { + setBasicModal2Open(false); + }} + > + Continue + + + } + > +

+ This is meant to make the user choose an option in order to + continue. +

+
+ + + setBasicModal2Open(false)} + > + Cancel + + { + setBasicModal2Open(false); + }} + > + Continue + + + } + > +

+ This is meant to make the user choose an option in order to + continue. +

+
+ + setContentModalOpen(true)}> + Open modal with lots of content and actions + + + + setContentModalOpen(false)} + > + Cancel + + { + setContentModalOpen(false); + }} + > + Continue + + + } + > +

+ This is a lot of content that make the modal scroll. This is a lot + of content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll.This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. +

+ + , + ): void { + throw new Error("Function not implemented."); + }} + > + {" "} +
+ + setContentModal2Open(true)}> + Open modal with lots of content and close button + + + setContentModal2Open(false)} + > +

+ This is a lot of content that make the modal scroll. This is a lot + of content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. +

+
+ + setBasicModal3Open(true)}> + Open basic modal with actions and close button + + + setBasicModal3Open(false)} + actions={ + + setBasicModal3Open(false)} + > + Cancel + + { + setBasicModal3Open(false); + }} + > + Continue + + + } + > +

+ The use can dismiss the modal by clicking outside of the modal, + clicking the close button, or choose an option to continue.{" "} +

+
+ + setNoHeaderModalOpen(true)}> + Open modal with no header + + + setNoHeaderModalOpen(false)} */ + actions={ + + setNoHeaderModalOpen(false)} + > + Cancel + + { + setNoHeaderModalOpen(false); + }} + > + Continue + + + } + > +

+ This is a modal with no header. Choose an option to continue. Lorem + ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + facilisis quam ac massa commodo fringilla. Sed gravida elit urna, + vel rhoncus velit ullamcorper vitae. Phasellus ullamcorper enim et + leo dignissim, sed dignissim mi varius. +

+
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Notification banner + + + + + Notification banner message + + + + Notification banner message that is really long and eventually it + wraps around the screen because it's so long that it needs to wrap + around the screen + + + + Notification banner message + + + + Notification banner message + + + + Notification banner message + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Pagination + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Popover + + + + +

This is a popover

+ It can be used for a number of different contexts. +
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Progress indicator + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Radio + + + + + radio1(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + +
+ + {" "} + {" "} +
+
+ + {" "} +
+ + {" "} + {" "} +
+
+
+
+ + + radio2(e.name, e.value)} + > + + + + + + + + + radio3(e.name, e.value)} + > + + Help text with a link. + + } + /> + + + + + + + radio3(e.name, e.value)} + > + + Help text with a link. + + } + /> + + + + + + + radio2(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + + + + + + + radio2(e.name, e.value)} + > + + + + + + + + + radio2(e.name, e.value)} + > + + + + + + +
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Scroll bar + + + + setContentModalScrollOpen(true)} + > + Open modal with lots of content to see scroll bar + + + + setContentModalScrollOpen(false)} + > + Cancel + + { + setContentModalScrollOpen(false); + }} + > + Continue + + + } + > +

+ This is a lot of content that make the modal scroll. This is a lot + of content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. This is a lot of content that + make the modal scroll. This is a lot of content that make the modal + scroll. This is a lot of content that make the modal scroll. This is + a lot of content that make the modal scroll. This is a lot of + content that make the modal scroll. +

+
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Side menu + + + + + + +
+ + + This is a side menu heading + + This is a side menu item + This is another side menu item + + + This is another side menu heading + + Side menu item + Side menu item + + } + > + Side menu heading + + + Foo + Bar + + + Foo + Bar + + Foo + Bar + + Foo + Bar + + + + +
+ + +
+
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Table + + + + + + + Status + Text + Number + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + + + Status + Text + Number + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + sortData(e.sortBy, e.sortDir)}> + + + + + First name + + + + + Last name + + + + + Age + + + + + + {users.map((user) => ( + + {user.firstName} + {user.lastName} + {user.age} + + ))} + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Tabs + + + + + + Tab 1 content: Lorem ipsum dolor sit amet, consectetur adipiscing + elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. + + + Tab 2 content: Lorem ipsum dolor sit amet, consectetur adipiscing + elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. + + + Tab 3 content: Lorem ipsum dolor sit amet, consectetur adipiscing + elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. + + + + + + + + + + No content + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Temporary notification + + + + { + setSnackbarKey((prev) => prev + 1); + setSnackbarVisible("basic"); + }} + > + Show basic (4s) + + + { + setSnackbarKey((prev) => prev + 1); + setSnackbarVisible("basic-plus"); + }} + > + Show basic with lots of content (7s) + + + { + setSnackbarKey((prev) => prev + 1); + setSnackbarVisible("basic-plus-button"); + }} + > + Show basic with lots of content and an action (10s) + + + { + setSnackbarKey((prev) => prev + 1); + setSnackbarVisible("success"); + }} + > + Show success with action + + + { + setSnackbarKey((prev) => prev + 1); + setSnackbarVisible("failure"); + }} + > + Show failure + + + { + setSnackbarKey((prev) => prev + 1); + setSnackbarVisible("loading"); + }} + > + Show loading (indefinite) + + + {/* + {snackbarVisible === "basic" && ( + + Short message for the user. + + )} + + {snackbarVisible === "basic-plus" && ( + + Lorem ipsum dolor sit amet consectetur. Donec odio mi cras scelerisque + libero purus. In facilisis tellus tristique orci. + + )} + + {snackbarVisible === "basic-plus-button" && ( + + Informational message for the user that is a lot more content that wraps + to another line. Informational message for the user that is a lot more + content that wraps to another line. +
+ { + alert("Undo clicked"); + setSnackbarVisible(false); + }} + > + Undo + +
+
+ )} + + {snackbarVisible === "success" && ( + + Action was successful! +
+ { + alert("Undo clicked"); + setSnackbarVisible(false); + }} + > + Undo + +
+
+ )} + + {snackbarVisible === "failure" && ( + + Something went wrong. Please try again. + + )} + + {snackbarVisible === "loading" && ( + + Your application is being submitted... +
+ setSnackbarVisible(false)} + > + Cancel + +
+
+ )} + + */} +
+ + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Text area + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Component ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} + + + Tooltip + + + + + + + + + + + + + + + + + + + + + + + + + {/* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */} +
+ +
+ + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + + + + + + + + + + {/* TODO: add file cards on upload file. eslint-disable-next-line @typescript-eslint/no-empty-function */} + console.log(file)} + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet consectetur sollicitudin. Lorem ipsum + dolor sit amet consectetur sollicitudin. Lorem ipsum dolor sit + amet consectetur sollicitudin. + + + } + > + + + + + + + + + + + + + + + + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + + + Status + Text + Number + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + + Text that runs really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really long{" "} + + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + + + Status + Text + Number + Action + + + + + + + + + Text that runs really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really really really really really really really really + really really long + + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + + Lorem ipsum + 1234567890 + + + Action + + + + + + + sortData(e.sortBy, e.sortDir)}> + + + First name + + + Last name + + + + + Age + + + + + + {users.map((user) => ( + + {user.firstName} + {user.lastName} + {user.age} + + ))} + + + + {/* Table Column Type Alignment Section - From TableExamples.tsx */} + + + + Normal Variant + + + + + + Select + ID + Name (Text Input) + Amount (Number) + Status (Badge) + Priority (Dropdown) + Actions (Buttons) + + + + + + { /* noop */ }} + /> + + 001 + + + + + + + + + + + + + + + + + + + console.log('Edit 001')} /> + console.log('Delete 001')} /> + + + + + + { /* noop */ }} + /> + + 002 + + + + + + + + + + + + + + + + + + + console.log('Edit 002')} /> + console.log('Delete 002')} /> + + + + + + { /* noop */ }} + /> + + 003 + + + + + + + + + + + + + + + + + + + console.log('Edit 003')} /> + console.log('Delete 003')} /> + + + + + + + + + + Relaxed Variant + + + + + + Select + ID + Name (Text Input) + Status (Badge) + Actions (Buttons) + + + + + + { /* noop */ }} + /> + + 001 + + + + + + + + + console.log('Edit')} /> + console.log('Delete')} /> + + + + + + { /* noop */ }} + /> + + 002 + + + + + + + + + console.log('Edit')} /> + console.log('Delete')} /> + + + + + + + + + + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + +
+ {" "} + none (below) +
+ +
+ 3xs +
+ +
+ 2xs +
+ +
+ xs +
+ +
+ s +
+ +
+ m +
+ +
+ l +
+ +
+ xl +
+ +
+ 2xl +
+ +
+ 3xl +
+ +
+ 4xl +
+ +
+ + +
+ +
+ none (beside) +
+
+ +
+ +
+ 3xs +
+
+ +
+ +
+ 2xs +
+
+ +
+ +
+ xs +
+
+ +
+ +
+ s +
+
+ +
+ +
+ m +
+
+ +
+ +
+ l +
+
+ +
+ +
+ xl +
+
+ +
+ +
+ 2xl +
+
+ +
+ +
+ 3xl +
+
+ +
+ +
+ 4xl +
+
+ +
+ +
+ fill +
+
+
+ + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + {" "} + Back link{" "} + + + {/* Apply max width to input, not form item for fixed width inputs. */} + + + Text colour + + + + Heading for the page + + + Heading for the page + + Heading for the page + + + TEST Heading extra large as page h1 Heading extra large as page h1 Heading + extra large as page h1 Heading extra large as page h1 Heading extra large + as page h1 Heading extra large as page h1 Heading extra large as page h1 + Heading extra large as page h1 + + + + Heading large + + + + Heading medium + + + + Heading small + + + + Heading extra small + + + + Body large Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec + rutrum dignissim erat quis iaculis. + + + + Body medium text, lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec rutrum dignissim erat quis iaculis. + + + + Body small text, lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec rutrum dignissim erat quis iaculis. + + + + Body extra small text, lorem ipsum dolor sit amet, consectetur adipiscing + elit. Donec rutrum dignissim erat quis iaculis. + + + + Text component with margin top and bottom + + + + Text component with margin top + + + + Text component with margin bottom + + + + {/* TAB ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */} + + + + Image + + + + + + + + Text + + + + + + + + Title + + + + + + + + Text-small + + + + + + + + Avatar + + + + + + + + Header + + + + + + + + Paragraph + + + + + + + + Thumbnail + + + + + + + + Card + + + + + + + + Profile + + + + + + + +
+
+
+ +
+ + + Link 123we + Link 2 + Link 3 + Other thing + + + Link 123we + Link 2 + Link 3 + Other thing + + + Meta link + Meta link + Meta link + Meta link + + + + + + {" "} + + + + + Meta link + Meta link + Meta link + Meta link + + + + + + Link 1 + Protected B + Link 3 + Other thing + + +
+
+ ); +} diff --git a/apps/prs/react/src/routes/everything.tsx b/apps/prs/react/src/routes/everything.tsx new file mode 100644 index 0000000000..ecd5d6fac2 --- /dev/null +++ b/apps/prs/react/src/routes/everything.tsx @@ -0,0 +1,1701 @@ +import { useState } from "react"; +import type { JSX } from "react"; +import { + GoabAccordion, + GoabAppFooter, + GoabAppFooterMetaSection, + GoabAppFooterNavSection, + GoabAppHeader, + GoabAppHeaderMenu, + GoabBadge, + GoabBlock, + GoabButton, + GoabButtonGroup, + GoabCalendar, + GoabCallout, + GoabCheckbox, + GoabCheckboxList, + GoabChip, + GoabCircularProgress, + GoabOneColumnLayout, + GoabContainer, + GoabDataGrid, + GoabDatePicker, + GoabDetails, + GoabDivider, + GoabDrawer, + GoabDropdown, + GoabDropdownItem, + GoabFieldset, + GoabFileUploadCard, + GoabFileUploadInput, + GoabFilterChip, + GoabFormItem, + GoabFormStep, + GoabFormStepper, + GoabGrid, + GoabHeroBanner, + GoabHeroBannerActions, + GoabIcon, + GoabIconButton, + GoabInput, + GoabInputNumber, + GoabLink, + GoabMenuAction, + GoabMenuButton, + GoabMicrositeHeader, + GoabModal, + GoabNotification, + GoabPageBlock, + GoabPages, + GoabPagination, + GoabPopover, + GoabPublicForm, + GoabPublicFormPage, + GoabPublicFormSummary, + GoabPublicFormTask, + GoabPublicFormTaskList, + GoabPublicSubform, + GoabPublicSubformIndex, + GoabRadioGroup, + GoabRadioItem, + GoabSideMenu, + GoabSideMenuGroup, + GoabSideMenuHeading, + GoabSkeleton, + GoabSpacer, + GoabSpinner, + GoabTab, + GoabTable, + GoabTableSortHeader, + GoabTabs, + GoabTemporaryNotificationCtrl, + GoabText, + GoabTextarea, + GoabTooltip, + GoabLinearProgress, +} from "@abgov/react-components"; +import { + GoabAccordionHeadingSize, + GoabAccordionIconPosition, + GoabBadgeType, + GoabButtonSize, + GoabButtonType, + GoabButtonVariant, + GoabCalloutIconTheme, + GoabCalloutType, + GoabCalendarOnChangeDetail, + GoabCheckboxListOnChangeDetail, + GoabCheckboxOnChangeDetail, + GoabCircularProgressSize, + GoabCircularProgressVariant, + GoabContainerAccent, + GoabContainerPadding, + GoabContainerType, + GoabContainerWidth, + GoabDatePickerInputType, + GoabDrawerPosition, + GoabDropdownItemMountType, + GoabDropdownOnChangeDetail, + GoabFilterChipTheme, + GoabFormItemLabelSize, + GoabFieldsetOnContinueDetail, + GoabFileUploadInputOnSelectFileDetail, + GoabFileUploadOnCancelDetail, + GoabFileUploadOnDeleteDetail, + GoabFormState, + GoabFormStepStatus, + GoabFormStepperOnChangeDetail, + GoabIconButtonVariant, + GoabIconSize, + GoabIconType, + GoabInputOnBlurDetail, + GoabInputOnChangeDetail, + GoabInputOnFocusDetail, + GoabInputOnKeyPressDetail, + GoabLinkButtonType, + GoabModalCalloutVariant, + GoabMenuButtonOnActionDetail, + GoabNotificationType, + GoabPaginationOnChangeDetail, + GoabPopoverPosition, + GoabRadioGroupOnChangeDetail, + GoabSkeletonSize, + GoabSkeletonType, + GoabSpinnerSize, + GoabSpinnerType, + GoabTableOnSortDetail, + GoabTabsOnChangeDetail, + GoabTextAreaOnBlurDetail, + GoabTextAreaOnChangeDetail, + GoabTextAreaOnKeyPressDetail, + GoabTextAreaCountBy, + GoabTextColor, + GoabTextSize, + GoabTooltipHorizontalAlignment, + GoabTooltipPosition, + GoabDatePickerOnChangeDetail, +} from "@abgov/ui-components-common"; +type EventLogEntry = { + name: string; + detail: unknown; + timestamp: string; +}; +const BADGE_TYPES: GoabBadgeType[] = [ + "information", + "success", + "important", + "emergency", + "dark", + "midtone", + "light", + "archived", + "aqua", + "black", + "blue", + "green", + "orange", + "pink", + "red", + "violet", + "white", + "yellow", + "aqua-light", + "black-light", + "blue-light", + "green-light", + "orange-light", + "pink-light", + "red-light", + "violet-light", + "yellow-light", +]; +const BUTTON_TYPES: GoabButtonType[] = [ + "primary", + "submit", + "secondary", + "tertiary", + "start", +]; +const BUTTON_VARIANTS: GoabButtonVariant[] = ["normal", "destructive", "inverse"]; +const BUTTON_SIZES: GoabButtonSize[] = ["normal", "compact"]; +const ACCORDION_HEADING_SIZES: GoabAccordionHeadingSize[] = ["small", "medium"]; +const ACCORDION_ICON_POSITIONS: GoabAccordionIconPosition[] = ["left", "right"]; +const CALLOUT_TYPES: GoabCalloutType[] = [ + "information", + "success", + "important", + "emergency", + "event", +]; +const CALLOUT_ICON_THEMES: GoabCalloutIconTheme[] = ["outline", "filled"]; +const CIRCULAR_PROGRESS_VARIANTS: GoabCircularProgressVariant[] = [ + "inline", + "fullscreen", +]; +const CIRCULAR_PROGRESS_SIZES: GoabCircularProgressSize[] = ["small", "large"]; +const CONTAINER_TYPES: GoabContainerType[] = [ + "interactive", + "non-interactive", + "info", + "error", + "success", + "important", +]; +const CONTAINER_ACCENTS: Array = [ + undefined, + "thin", + "thick", + "filled", +]; +const CONTAINER_PADDINGS: GoabContainerPadding[] = ["compact", "relaxed"]; +const CONTAINER_WIDTHS: GoabContainerWidth[] = ["content", "full"]; +const DATE_PICKER_INPUTS: GoabDatePickerInputType[] = ["calendar", "input"]; +const DROPDOWN_MOUNT_TYPES: GoabDropdownItemMountType[] = ["append", "prepend", "reset"]; +const FILTER_CHIP_THEMES: GoabFilterChipTheme[] = ["outline", "filled"]; +const FORM_ITEM_LABEL_SIZES: GoabFormItemLabelSize[] = ["regular", "large"]; +const FORM_STEP_STATUSES: GoabFormStepStatus[] = [ + "not-started", + "incomplete", + "complete", +]; +const ICON_BUTTON_VARIANTS: GoabIconButtonVariant[] = [ + "color", + "nocolor", + "dark", + "light", + "destructive", +]; +const ICON_TYPES: GoabIconType[] = [ + "home", + "alert", + "checkmark-circle", + "information-circle", + "menu", +]; +const LINK_BUTTON_TYPES: GoabLinkButtonType[] = [ + "start", + "primary", + "secondary", + "tertiary", +]; +const POPOVER_POSITIONS: GoabPopoverPosition[] = ["auto", "above", "below"]; +const SPINNER_TYPES: GoabSpinnerType[] = ["infinite", "progress"]; +const SPINNER_SIZES: GoabSpinnerSize[] = ["small", "medium", "large", "xlarge"]; +const NOTIFICATION_TYPES: GoabNotificationType[] = [ + "information", + "important", + "emergency", + "event", +]; +const MODAL_CALLOUT_VARIANTS: GoabModalCalloutVariant[] = [ + "information", + "important", + "emergency", + "success", + "event", +]; +const SKELETON_TYPES: GoabSkeletonType[] = [ + "text", + "title", + "text-small", + "avatar", + "header", + "paragraph", + "thumbnail", + "card", + "profile", +]; +const SKELETON_SIZES: GoabSkeletonSize[] = ["1", "2", "3", "4"]; +const TOOLTIP_POSITIONS: GoabTooltipPosition[] = ["top", "bottom", "left", "right"]; +const TOOLTIP_ALIGNMENTS: GoabTooltipHorizontalAlignment[] = ["left", "center", "right"]; +const TEXT_SIZES: GoabTextSize[] = [ + "heading-xl", + "heading-l", + "heading-m", + "heading-s", + "heading-xs", + "body-l", + "body-m", + "body-s", + "body-xs", +]; +const TEXT_COLORS: GoabTextColor[] = ["primary", "secondary"]; +const TEXTAREA_COUNT_BY: GoabTextAreaCountBy[] = ["", "character", "word"]; +const TAB_ITEMS = [ + { id: "tab-1", heading: "Overview" }, + { id: "tab-2", heading: "Details" }, + { id: "tab-3", heading: "Attachments" }, +]; +const TABLE_DATA = [ + { name: "Alpha", created: "2024-02-14", status: "Active", progress: 68 }, + { name: "Beta", created: "2023-11-08", status: "Paused", progress: 34 }, + { name: "Gamma", created: "2024-05-22", status: "Active", progress: 82 }, +]; +export function EverythingRoute(): JSX.Element { + const [eventLog, setEventLog] = useState([]); + const [checkboxValue, setCheckboxValue] = useState(false); + const [checkboxListSelection, setCheckboxListSelection] = useState([]); + const [dropdownSelection, setDropdownSelection] = useState(); + const [dropdownMultiSelection, setDropdownMultiSelection] = useState([]); + const [selectedRadio, setSelectedRadio] = useState("option-1"); + const [datePickerValue, setDatePickerValue] = useState("2025-05-15"); + const [datePickerInputValue, setDatePickerInputValue] = useState< + string | Date | undefined + >("2025-05-20"); + const [textInputValue, setTextInputValue] = useState("Sample value"); + const [numberInputValue, setNumberInputValue] = useState(42); + const [textareaValue, setTextareaValue] = useState( + "Sample multiline text\nsecond line", + ); + const [calendarSelectedDate, setCalendarSelectedDate] = useState(); + const [spinnerProgress] = useState(65); + const [paginationState, setPaginationState] = useState({ + page: 1, + perPage: 10, + total: 75, + }); + const [tableSortState, setTableSortState] = useState({ + sortBy: "name", + sortDir: -1, + }); + const [tabsState, setTabsState] = useState(1); + const [formStepperState, setFormStepperState] = useState(-1); + const [drawerState, setDrawerState] = useState<{ + open: boolean; + position: GoabDrawerPosition; + }>({ + open: false, + position: "right", + }); + const [modalState, setModalState] = useState({ standard: false, alert: false }); + const [notificationDismissed, setNotificationDismissed] = useState(false); + const [accordionLastToggle, setAccordionLastToggle] = useState<{ + heading: string; + open: boolean; + }>(); + const [chipClicks, setChipClicks] = useState(0); + const [filterChipClicks, setFilterChipClicks] = useState(0); + const [fileUploadCardEvents, setFileUploadCardEvents] = useState([]); + const [fileUploadInputFiles, setFileUploadInputFiles] = useState([]); + const [headerMenuActivated, setHeaderMenuActivated] = useState(false); + const [iconButtonClickCount, setIconButtonClickCount] = useState< + Record + >({ + color: 0, + nocolor: 0, + dark: 0, + light: 0, + destructive: 0, + }); + const [inputTrailingClicks, setInputTrailingClicks] = useState(0); + const [numberInputTrailingClicks, setNumberInputTrailingClicks] = useState(0); + const [menuAction, setMenuAction] = useState(); + const [publicFormEvents, setPublicFormEvents] = useState([]); + const [fieldsetContinueEvents, setFieldsetContinueEvents] = useState< + GoabFieldsetOnContinueDetail[] + >([]); + const [publicSubformEvents, setPublicSubformEvents] = useState([]); + const logEvent = (name: string, detail: unknown) => { + console.log(`[everything][react] ${name}`, detail); + const entry: EventLogEntry = { name, detail, timestamp: new Date().toISOString() }; + setEventLog((prev) => [entry, ...prev].slice(0, 50)); + }; + const handleButtonClick = ( + type: GoabButtonType, + variant?: GoabButtonVariant, + size?: GoabButtonSize, + ) => { + logEvent("button.click", { type, variant, size }); + }; + const handleAccordionChange = (heading: string, open: boolean) => { + setAccordionLastToggle({ heading, open }); + logEvent("accordion.change", { heading, open }); + }; + const handleCheckboxChange = (detail: GoabCheckboxOnChangeDetail) => { + setCheckboxValue(detail.checked); + logEvent("checkbox.change", detail); + }; + const handleCheckboxListChange = (detail: GoabCheckboxListOnChangeDetail) => { + setCheckboxListSelection(detail.value || []); + logEvent("checkboxList.change", detail); + }; + const handleDropdownChange = (detail: GoabDropdownOnChangeDetail) => { + setDropdownSelection(detail.value); + setDropdownMultiSelection(detail.values || []); + logEvent("dropdown.change", detail); + }; + const handleCalendarChange = (detail: GoabCalendarOnChangeDetail) => { + setCalendarSelectedDate(detail.value); + logEvent("calendar.change", detail); + }; + const handleChipClick = (label: string) => { + setChipClicks((prev) => { + const next = prev + 1; + logEvent("chip.click", { label, count: next }); + return next; + }); + }; + const handleFilterChipClick = (label: string) => { + setFilterChipClicks((prev) => { + const next = prev + 1; + logEvent("filterChip.click", { label, count: next }); + return next; + }); + }; + const handleRadioChange = (detail: GoabRadioGroupOnChangeDetail) => { + setSelectedRadio(detail.value); + logEvent("radio.change", detail); + }; + const handleDatePickerChange = (detail: GoabDatePickerOnChangeDetail) => { + setDatePickerValue((detail.value || "").toString()); + logEvent("datePicker.change", detail); + }; + const handleDateInputChange = (detail: GoabDatePickerOnChangeDetail) => { + setDatePickerInputValue(detail.value); + logEvent("datePicker.input", detail); + }; + const handleInputChange = (detail: GoabInputOnChangeDetail) => { + setTextInputValue(detail.value); + logEvent("input.change", detail); + }; + const handleInputFocus = (detail: GoabInputOnFocusDetail) => + logEvent("input.focus", detail); + const handleInputBlur = (detail: GoabInputOnBlurDetail) => + logEvent("input.blur", detail); + const handleInputKeyPress = (detail: GoabInputOnKeyPressDetail) => + logEvent("input.keyPress", detail); + const handleInputTrailingIconClick = () => { + setInputTrailingClicks((prev) => { + const next = prev + 1; + logEvent("input.trailingIconClick", { count: next }); + return next; + }); + }; + const handleNumberInputChange = (detail: GoabInputOnChangeDetail) => { + setNumberInputValue(Number(detail.value)); + logEvent("input-number.change", detail); + }; + const handleNumberInputTrailingIconClick = () => { + setNumberInputTrailingClicks((prev) => { + const next = prev + 1; + logEvent("input-number.trailingIconClick", { count: next }); + return next; + }); + }; + const handleTextareaChange = (detail: GoabTextAreaOnChangeDetail) => { + setTextareaValue(detail.value); + logEvent("textarea.change", detail); + }; + const handleTextareaKeyPress = (detail: GoabTextAreaOnKeyPressDetail) => + logEvent("textarea.keyPress", detail); + const handleTextareaBlur = (detail: GoabTextAreaOnBlurDetail) => + logEvent("textarea.blur", detail); + const handleFileUploadCardCancel = (detail: GoabFileUploadOnCancelDetail) => { + setFileUploadCardEvents((prev) => + [`Cancelled: ${detail.filename}`, ...prev].slice(0, 5), + ); + logEvent("fileUploadCard.cancel", detail); + }; + const handleFileUploadCardDelete = (detail: GoabFileUploadOnDeleteDetail) => { + setFileUploadCardEvents((prev) => + [`Deleted: ${detail.filename}`, ...prev].slice(0, 5), + ); + logEvent("fileUploadCard.delete", detail); + }; + const handleFileUploadInputSelect = (detail: GoabFileUploadInputOnSelectFileDetail) => { + setFileUploadInputFiles((prev) => { + const name = detail.file?.name; + if (!name) { + return prev; + } + return [name, ...prev].slice(0, 5); + }); + logEvent("fileUploadInput.select", { + name: detail.file?.name, + size: detail.file?.size, + type: detail.file?.type, + }); + }; + const toggleDrawer = (position: GoabDrawerPosition) => { + setDrawerState((prev) => { + const nextOpen = !(prev.open && prev.position === position); + const next = { open: nextOpen, position }; + logEvent("drawer.toggle", next); + return next; + }); + }; + const handleDrawerClose = () => { + setDrawerState((prev) => ({ ...prev, open: false })); + logEvent("drawer.close", {}); + }; + const openModal = (kind: "standard" | "alert") => { + setModalState((prev) => { + const next = { ...prev, [kind]: true }; + logEvent(`modal.${kind}.open`, true); + return next; + }); + }; + const closeModal = (kind: "standard" | "alert") => { + setModalState((prev) => { + const next = { ...prev, [kind]: false }; + logEvent(`modal.${kind}.close`, true); + return next; + }); + }; + const handleNotificationDismiss = () => { + setNotificationDismissed(true); + logEvent("notification.dismiss", {}); + }; + const handleHeaderMenuClick = () => { + setHeaderMenuActivated(true); + logEvent("header.menuClick", {}); + }; + const handleIconButtonClick = (variant: GoabIconButtonVariant) => { + setIconButtonClickCount((prev) => { + const next = { ...prev, [variant]: (prev[variant] || 0) + 1 }; + logEvent("iconButton.click", { variant, count: next[variant] }); + return next; + }); + }; + const handleMenuAction = (detail: GoabMenuButtonOnActionDetail) => { + setMenuAction(detail.action); + logEvent("menu.action", detail); + }; + const handlePaginationChange = (detail: GoabPaginationOnChangeDetail) => { + setPaginationState((prev) => ({ ...prev, page: detail.page })); + logEvent("pagination.change", detail); + }; + const handleTabsChange = (detail: GoabTabsOnChangeDetail) => { + setTabsState(detail.tab); + logEvent("tabs.change", detail); + }; + const handleTableSort = (detail: GoabTableOnSortDetail) => { + setTableSortState(detail); + logEvent("table.sort", detail); + }; + const handleFormStepperChange = (detail: GoabFormStepperOnChangeDetail) => { + setFormStepperState(detail.step); + logEvent("formStepper.change", detail); + }; + const drawerActions = ( + toggleDrawer(drawerState.position)}> + Close + + ); + const modalPrimaryActions = ( + + closeModal("standard")}> + Cancel + + closeModal("standard")}> + Confirm + + + ); + const modalAlertActions = ( + closeModal("alert")}> + Acknowledge + + ); + const heroActions = ( + + handleButtonClick("primary")}> + Get started + + handleButtonClick("secondary")}> + Secondary CTA + + + ); + const tooltipContent = "Tooltip content rendered via template."; + const popoverTarget = Popover target; + const eventLogSection = ( + + + + Recent events + + + {eventLog.length === 0 ? ( + + Interact with the components to populate the log. + + ) : ( + eventLog.map((entry, index) => ( + + + + {entry.timestamp} - {entry.name} + +
+                    {JSON.stringify(entry.detail, null, 2)}
+                  
+
+
+ )) + )} +
+
+
+ ); + const layoutSection = ( + + + + + + Text sizes + + + {TEXT_SIZES.map((size) => ( + + {size} + + ))} + + + + + Text colors + + + {TEXT_COLORS.map((color) => ( + + {color.charAt(0).toUpperCase() + color.slice(1)} text + + ))} + + + + + Block variations + + + + + + + + + + + + + + + + Containers + + + {CONTAINER_TYPES.map((type, index) => ( + + + Type: {type} +
+ Accent: {CONTAINER_ACCENTS[index % CONTAINER_ACCENTS.length] ?? "none"} +
+
+ ))} +
+
+ + + Grid & Column layout + + + + + + Responsive grid cards + + + The grid wrapper uses minChildWidth="180px" to + automatically wrap items. + + + + + Column layout constrains inner content to a readable width. + + + + + Use padding tokens to illustrate spacing. + + + + + + + Decorative illustration + + Card image & actions + + + Cards support image and actions slots via dedicated wrapper components. + + + + handleButtonClick("secondary")}> + Preview + + handleButtonClick("primary")}> + Approve + + + + + + Spacers & Pages + + + + + Spacer samples + + + + Left + + + + Right + + + + + Vertical spacer: + + + + + + + + Pages control + + + Overview + Details + History + + + + +
+
+ ); + const buttonsSection = ( + + + + + Buttons by type + + + {BUTTON_TYPES.map((type) => ( + handleButtonClick(type)}> + {type.charAt(0).toUpperCase() + type.slice(1)} button + + ))} + + + + + Variants & sizes + + + {BUTTON_VARIANTS.map((variant) => ( + + + {variant.charAt(0).toUpperCase() + variant.slice(1)} + + {BUTTON_SIZES.map((size) => ( + handleButtonClick("primary", variant, size)} + > + {size} / {variant} + + ))} + + ))} + + + + + Button group & links + + + + handleButtonClick("primary")}> + Primary + + handleButtonClick("secondary")}> + Secondary + + handleButtonClick("tertiary")}> + Tertiary + + + + {LINK_BUTTON_TYPES.map((linkType) => ( + + {linkType.charAt(0).toUpperCase() + linkType.slice(1)} link (action + logged) + + ))} + + + + + + Icon buttons & icons + + + {ICON_BUTTON_VARIANTS.map((variant, index) => ( + handleIconButtonClick(variant)} + /> + ))} + + + Click counts: {JSON.stringify(iconButtonClickCount)} + + + {ICON_TYPES.map((icon, index) => ( + + ))} + + + + + Menu button + + + + + + + + + Latest menu action: {menuAction ?? "pending"} + + + + + ); + const indicatorsSection = ( + + + + + Badge palette + + + {BADGE_TYPES.map((badgeType) => ( + + ))} + + + + + Chips + + + handleChipClick("default chip")} + /> + handleChipClick("leading icon")} + /> + handleChipClick("deletable")} + /> + + + Clicks tracked: {chipClicks} + + + + + Filter chips + + + {FILTER_CHIP_THEMES.map((theme) => ( + handleFilterChipClick(theme)} + /> + ))} + + + Filter chip clicks: {filterChipClicks} + + + + + ); + const formSection = ( + + + + + Inputs + + + Value: {textInputValue}} + > + + + {FORM_ITEM_LABEL_SIZES.map((size) => ( + Label size: {size}} + > + + + ))} + + + + + Number input & textarea + + + + Current: {numberInputValue} (trailing icon clicks:{" "} + {numberInputTrailingClicks}) + + } + > + + + + Length: {textareaValue.length} chars + + } + > + + + + + + + Checkboxes & radio + + + + Checked: {checkboxValue.toString()} + + } + > + + + + Selected:{" "} + {checkboxListSelection.length + ? checkboxListSelection.join(", ") + : "None"} + + } + > + + + + + + + + Selected: {selectedRadio} + + } + > + + + + + + + + + + + Dropdowns + + + + Selected: {dropdownSelection ?? "None"} + + } + > + + + + + + + + Selected:{" "} + {dropdownMultiSelection.length + ? dropdownMultiSelection.join(", ") + : "None"} + + } + > + + {DROPDOWN_MOUNT_TYPES.map((mount) => ( + + ))} + + + + + + + Date controls + + + + + + + + + + Selected date: {calendarSelectedDate ?? "None"} + + } + > + + + + + + + File upload + + + + Files:{" "} + {fileUploadInputFiles.length ? fileUploadInputFiles.join(", ") : "None"} + + } + > + + + + {fileUploadCardEvents[0] ?? "No actions yet"} + + } + > + + + + + + + Form stepper + + + {FORM_STEP_STATUSES.map((status, index) => ( + + ))} + + +
Page 1 content
+
Page 2 content
+
Page 3 content
+
Page 4 content
+
+ + Active step: {formStepperState} + +
+
+
+ ); + const feedbackSection = ( + + + + + Callouts + + + {CALLOUT_TYPES.map((type, index) => ( + + + This is a {type} callout using the{" "} + {CALLOUT_ICON_THEMES[index % CALLOUT_ICON_THEMES.length]} icon theme. + + + ))} + + + + + Notifications + + {NOTIFICATION_TYPES.map((type) => ( + + {type.charAt(0).toUpperCase() + type.slice(1)} notification. Dismiss to + trigger logging. + + ))} + + Dismissed: {notificationDismissed.toString()} + + + + + Modal & Drawer + + + openModal("standard")}> + Open Modal + + openModal("alert")}> + Open Alert Modal + + toggleDrawer(drawerState.position)} + > + Toggle Drawer ({drawerState.position}) + + + closeModal("standard")} + actions={modalPrimaryActions} + > + + Standard modal content with template driven actions. + + + closeModal("alert")} + actions={modalAlertActions} + > + + Alert modals demonstrate template headings by reusing tooltip content. + + + + + Drawer body content. + + + + + + Tooltip & Popover + + + {TOOLTIP_POSITIONS.map((pos, index) => ( + + Tooltip {pos} + + ))} + + + Popover content aligned {POPOVER_POSITIONS[1]} relative to the button. + + + + + + + Progress & Skeletons + + + + + Circular progress + + {CIRCULAR_PROGRESS_VARIANTS.map((variant, index) => ( + + ))} + + Linear Progress + + + + + + + Spinner types + + {SPINNER_TYPES.map((type, index) => ( + + ))} + + + + Skeletons + + {SKELETON_TYPES.map((skeleton, index) => ( + + ))} + + + + + + Temporary notification controller + + + + Controller is positioned top-right to ensure attributes are respected. + + + + + ); + const navigationSection = ( + + + + + Accordion & Tabs + + + {ACCORDION_HEADING_SIZES.map((headingSize, index) => ( + } + open={index === 0} + onChange={(open) => handleAccordionChange(`Accordion ${index + 1}`, open)} + > + + Accordion content for {headingSize} heading. Toggle to emit change + events. + + + ))} + + + Last toggle: {accordionLastToggle?.heading ?? "None"} ?{" "} + {accordionLastToggle?.open?.toString() ?? "n/a"} + + + + + Unassigned cases content. + + + + Assigned to me + + } + > + + Cases assigned to me content. + + + + In progress + + } + > + + Cases in progress content. + + + + + Completed cases content. + + + + + Selected tab index: {tabsState} + + + Segmented Tabs Variant + + + + + Unassigned cases content. + + + + Assigned to me + + } + > + + Cases assigned to me content. + + + + In progress + + } + > + + Cases in progress content. + + + + + Completed cases content. + + + + + + + Table & Pagination + + + + + + + + + + + + + {TABLE_DATA.map((row) => ( + + + + + + + ))} + +
+ + Name + + + + Created + + StatusProgress
{row.name}{row.created}{row.status}{row.progress}%
+
+ + Last sort: {tableSortState.sortBy} ({tableSortState.sortDir}) + + + + Page: {paginationState.page} /{" "} + {Math.ceil(paginationState.total / paginationState.perPage)} + +
+ + + Data Grid (Keyboard Navigation) + + + The data grid wraps a table to enable keyboard navigation. Use arrow keys to move between cells. + + + + + + + + + + + + + + + {TABLE_DATA.map((row) => ( + + + + + + + + ))} + +
NameCreatedStatusProgressActions
{row.name}{row.created} + + {row.progress}% + View +
+
+
+
+ + + Site chrome + + + + + Home + + Item 1 + Item 2 + + + + + Hero banner demonstrates background imagery and projected actions. + + {heroActions} + + + + Menu heading + + Link A + Link B + + Loose link + + + + Content area with side menu demonstrates layout wrappers. + + + + + + Documentation + Support + + + + Copyright 2025 Government of Alberta + + + + + + Header menu clicked: {headerMenuActivated.toString()} + + +
+
+ ); + const sections = [ + eventLogSection, + layoutSection, + buttonsSection, + indicatorsSection, + formSection, + feedbackSection, + navigationSection, + ]; + return ( + + + All Components - React Component Showcase + + + This route mirrors the Angular manual test to verify every component and event + handler in the React wrappers. + + {sections.map((section, index) => ( +
{section}
+ ))} +
+ ); +} +export default EverythingRoute; diff --git a/apps/prs/react/src/routes/features/feat1383.tsx b/apps/prs/react/src/routes/features/feat1383.tsx new file mode 100644 index 0000000000..a8fe54e3c1 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat1383.tsx @@ -0,0 +1,308 @@ +import { + GoabBadge, + GoabBlock, + GoabButton, + GoabGrid, + GoabIcon, + GoabIconButton, + GoabInput, + GoabMenuAction, + GoabMenuButton, + GoabText, +} from "@abgov/react-components"; +import { + GoabIconBaseType, + GoabIconOverridesType, + GoabIconTheme, + GoabIconType, +} from "@abgov/ui-components-common"; + +type IconType = { + id: number; + icon: GoabIconBaseType | GoabIconOverridesType; +}; + +const iconTypes: IconType[] = [ + { id: 1, icon: "accessibility" }, + { id: 2, icon: "backspace" }, + { id: 3, icon: "cafe" }, + { id: 4, icon: "desktop" }, + { id: 5, icon: "ear" }, + { id: 6, icon: "fast-food" }, + { id: 7, icon: "game-controller" }, + { id: 8, icon: "hammer" }, + { id: 9, icon: "ice-cream" }, + { id: 10, icon: "journal" }, + { id: 11, icon: "key" }, + { id: 12, icon: "laptop" }, + { id: 13, icon: "magnet" }, + { id: 14, icon: "navigate-circle" }, + { id: 15, icon: "open" }, + { id: 16, icon: "paper-plane" }, + { id: 17, icon: "qr-code" }, + { id: 18, icon: "radio" }, + { id: 19, icon: "sad" }, + { id: 20, icon: "tablet-landscape" }, + { id: 21, icon: "umbrella" }, + { id: 22, icon: "videocam-off" }, + { id: 23, icon: "walk" }, + { id: 24, icon: "add-circle" }, + { id: 25, icon: "bookmark" }, + { id: 26, icon: "calendar" }, + { id: 27, icon: "documents" }, + { id: 28, icon: "eye-off" }, + { id: 29, icon: "filter" }, + { id: 30, icon: "help-circle" }, + { id: 31, icon: "information-circle" }, + { id: 32, icon: "mail" }, + { id: 33, icon: "notifications" }, + { id: 34, icon: "open" }, + { id: 35, icon: "pencil" }, + { id: 36, icon: "remove" }, + { id: 37, icon: "search" }, + { id: 38, icon: "trash" }, + { id: 39, icon: "warning" }, +]; + +const scenarios: { + id: number; + title: string; + description: string; + type: GoabIconType; + theme?: GoabIconTheme; +}[] = [ + { + id: 1, + title: "New syntax :filled for type", + description: "type uses :filled and no theme property is set.", + type: "accessibility:filled", + }, + { + id: 2, + title: "New syntax :outline for type", + description: "type uses :outline and no theme property is set", + type: "accessibility:outline", + }, + { + id: 3, + title: "Conflicting type and theme", + description: "type uses :filled, theme prop is outline. Type should win.", + type: "accessibility:filled", + theme: "outline", + }, + { + id: 4, + title: "Legacy theme property - filled", + description: "Setting filled via theme property, should still work", + type: "accessibility", + theme: "filled", + }, + { + id: 5, + title: "Default outline", + description: + "No theme property, and no type setting the theme. Default should be outline", + type: "accessibility", + }, +]; + +function filled(icon: IconType): GoabIconType { + return `${icon.icon}:filled` as GoabIconType; +} + +export function Feat1383Route() { + return ( +
+ 1383: Button: Filled Icons + + + {scenarios.map((scenario) => ( + + + {scenario.title} + + + {scenario.description} + + + + + + + type: {scenario.type} + + + theme property: {scenario.theme ?? "(none)"} + + + + + ))} + + + + Default icons (outline theme) + + + {iconTypes.map((icon) => ( + + + + {icon.icon} + + + ))} + + + + Filled via theme attribute + + + {iconTypes.map((icon) => ( + + + + {icon.icon} (theme=filled) + + + ))} + + + + Filled via type suffix + + + {iconTypes.map((icon) => ( + + + + {icon.icon}:filled + + + ))} + + + + GoabBadge iconType property + + + + + + + + + + + + GoabButton leading/trailing icons properties + + + + + accessibility + + + + + accessibility:filled + + + + + + GoabIconButton icon property + + + + + + + + + + + + GoabInput leading/trailing icon properties + + + + + + + + + + + + GoabMenuButton icon property + + + + + + + + + + + + + +
+ ); +} + +export default Feat1383Route; diff --git a/apps/prs/react/src/routes/features/feat1547.tsx b/apps/prs/react/src/routes/features/feat1547.tsx new file mode 100644 index 0000000000..d9778f86d1 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat1547.tsx @@ -0,0 +1,38 @@ +import { GoabTooltip, GoabIcon, GoabBlock } from "@abgov/react-components"; + +export function Feat1547Route() { + return ( + <> +

Feature 1547

+

Feature 1547 implementation

+ + + + + + + +

+ This is a multiline tooltip with bold text. +

+

+ Here's some italic text on a separate line. +

+

+ And here's a{" "} + + link + {" "} + on its own line. +

+ + } + > + +
+
+ + ); +} diff --git a/apps/prs/react/src/routes/features/feat1813.tsx b/apps/prs/react/src/routes/features/feat1813.tsx new file mode 100644 index 0000000000..adb223e391 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat1813.tsx @@ -0,0 +1,301 @@ +import { useLayoutEffect, useMemo, useState } from "react"; +import { + GoabDatePicker, + GoabBlock, + GoabText, + GoabPopover, + GoabButton, + GoabFormItem, + GoabDropdown, + GoabDropdownItem, +} from "@abgov/react-components"; +import { GoabDropdownOnChangeDetail } from "@abgov/ui-components-common"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +type DatePickerScenario = { + id: string; + label: string; + width?: string; + containerWidth?: string; + type?: "calendar" | "input"; + description: string; + emphasis?: string; +}; + +type ScenarioMeasurement = { + hostWidth?: number; + inputWidth?: number; + widthAttr?: string | null; +}; + +export function Feat1813Route() { + const [lastSelectedDate, setLastSelectedDate] = useState(""); + const [lastSelectedDropdown, setLastSelectedDropdown] = useState(""); + const [dropdownValue, setDropdownValue] = useState(""); + const [measurements, setMeasurements] = useState>( + {}, + ); + + const scenarios = useMemo( + () => [ + { + id: "default", + label: "Default (no width provided)", + description: "Falls back to the shared 16ch default like other inputs.", + }, + { + id: "ch-24", + label: "Character width (24ch)", + width: "24ch", + description: "Confirms ch units make it through to the rendered input.", + }, + { + id: "px-360", + label: "Fixed width (360px)", + width: "360px", + description: "Validates px widths while keeping the popover aligned.", + }, + { + id: "percent-80", + label: "Relative width (80% of 560px container)", + width: "80%", + containerWidth: "560px", + description: "Ensures percentage widths respect their parent container.", + }, + { + id: "clamp-small", + label: "Requested width below minimum (8ch in a 120px slot)", + width: "8ch", + containerWidth: "120px", + description: "Should never shrink below the minimum readable width (≈16ch).", + emphasis: "Must clamp ≥ 16ch so the date stays legible.", + }, + { + id: "input-segments", + label: "Type “input” with explicit width (340px)", + width: "340px", + type: "input", + description: + "Segmented month/day/year inputs should line up within the requested width.", + }, + ], + [], + ); + + const onDateChange = (details: GoabDatePickerOnChangeDetail) => { + console.log("Date changed:", details); + setLastSelectedDate( + details.value ? new Date(details.value).toLocaleDateString() : "None", + ); + }; + + const dropdownChange = (details: GoabDropdownOnChangeDetail) => { + if (!details.value) { + console.log("Value empty"); + setDropdownValue(lastSelectedDropdown); + } else { + console.log("Value changed: ", details.value); + setLastSelectedDropdown(details.value); + setDropdownValue(details.value); + } + }; + + useLayoutEffect(() => { + const readMeasurements = (): Record => { + const result: Record = {}; + + scenarios.forEach((scenario) => { + const wrapper = document.querySelector( + `[data-scenario="${scenario.id}"]`, + ); + const host = wrapper?.querySelector("goa-date-picker") ?? undefined; + const hostWidth = host?.getBoundingClientRect().width; + + const popover = host?.shadowRoot?.querySelector("goa-popover"); + const goaInput = popover?.querySelector("goa-input"); + const widthAttr = goaInput?.getAttribute("width") ?? null; + const inputElement = + goaInput?.shadowRoot?.querySelector("input") ?? + goaInput ?? + undefined; + const inputWidth = inputElement?.getBoundingClientRect().width; + + if (scenario.type === "input" && !goaInput) { + const formItem = host?.shadowRoot?.querySelector("goa-form-item"); + result[scenario.id] = { + hostWidth: hostWidth ? Math.round(hostWidth) : undefined, + inputWidth: formItem + ? Math.round(formItem.getBoundingClientRect().width) + : undefined, + widthAttr, + }; + return; + } + + result[scenario.id] = { + hostWidth: hostWidth ? Math.round(hostWidth) : undefined, + inputWidth: inputWidth ? Math.round(inputWidth) : undefined, + widthAttr, + }; + }); + + return result; + }; + + const equalMeasurements = ( + prev: Record, + next: Record, + ) => { + const prevKeys = Object.keys(prev); + const nextKeys = Object.keys(next); + if (prevKeys.length !== nextKeys.length) { + return false; + } + return prevKeys.every((key) => { + const prevValue = prev[key]; + const nextValue = next[key]; + if (!prevValue && !nextValue) { + return true; + } + if (!prevValue || !nextValue) { + return false; + } + return ( + prevValue.hostWidth === nextValue.hostWidth && + prevValue.inputWidth === nextValue.inputWidth && + prevValue.widthAttr === nextValue.widthAttr + ); + }); + }; + + const update = () => { + requestAnimationFrame(() => { + setMeasurements((prev) => { + const next = readMeasurements(); + if (equalMeasurements(prev, next)) { + return prev; + } + return next; + }); + }); + }; + + update(); + window.addEventListener("resize", update); + return () => { + window.removeEventListener("resize", update); + }; + }, [scenarios]); + + return ( +
+ + Date Picker width property + + + Exercises fixed, relative, and constrained widths for the calendar view and + segmented input flavour. Measurements capture what the DOM reports so regressions + are easy to spot. + + + + + {scenarios.map((scenario) => ( +
+ + + {scenario.label} + + + {scenario.description} + + {scenario.emphasis ? ( + + {scenario.emphasis} + + ) : null} + + + + + + + Host width: + {measurements[scenario.id]?.hostWidth !== undefined + ? ` ${measurements[scenario.id]?.hostWidth}px` + : " –"} + {" · "}Input width: + {measurements[scenario.id]?.inputWidth !== undefined + ? ` ${measurements[scenario.id]?.inputWidth}px` + : " –"} + + + Input width attribute: + {measurements[scenario.id]?.widthAttr !== undefined + ? ` ${measurements[scenario.id]?.widthAttr || "none"}` + : " –"} + + +
+ ))} +
+ +
+ Popover + + Popover Test + + } + > +

This is a popover

+

It can be used for a number of different contexts

+
+
+ +
+ + dropdownChange(details)} + width="300px" + filterable={true} + > + + + + + + + + + + +
+ +
+

Test Results

+ + Last selected date: {lastSelectedDate || "None selected"} + + + Last selected dropdown: {lastSelectedDropdown || "None selected"} + +
+
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat1908.tsx b/apps/prs/react/src/routes/features/feat1908.tsx new file mode 100644 index 0000000000..f0867d9e99 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat1908.tsx @@ -0,0 +1,120 @@ +import { useEffect, useState } from "react"; +import { + GoabBlock, + GoabButton, + GoabCheckbox, + GoabLinearProgress, + GoabText, +} from "@abgov/react-components"; +import { GoabCheckboxOnChangeDetail } from "@abgov/ui-components-common"; + +export function Feat1908Route() { + const [dynamicProgress, setDynamicProgress] = useState(null); + const [autoProgress, setAutoProgress] = useState(0); + const [showProgressPercentage, setShowProgressPercentage] = useState(true); + + const decreaseProgress = () => { + if (!dynamicProgress) { + setDynamicProgress(100); + return; + } + setDynamicProgress((prev) => Math.max(0, (prev ?? 0) - 10)); + }; + + const increaseProgress = () => { + if (dynamicProgress === 100) { + setDynamicProgress(0); + return; + } + setDynamicProgress((prev) => Math.min(100, (prev ?? 0) + 10)); + }; + + const resetProgress = () => { + setDynamicProgress(0); + }; + + const nullProgress = () => { + setDynamicProgress(undefined); + }; + + const onShowPercentageChange = (detail: GoabCheckboxOnChangeDetail) => { + setShowProgressPercentage(detail.checked); + }; + + useEffect(() => { + const intervalId = setInterval(() => { + let nextProgress = autoProgress + 0.25; + if (nextProgress > 100) { + nextProgress = 0; + } + setAutoProgress(nextProgress); + }, 100); + + return () => { + clearInterval(intervalId); + }; + }); + + return ( + + Feature 1908: Linear Progress Bar + + Linear Progress + + Determinate Progress - 25% + + + Determinate Progress - 50% + + + Determinate Progress - 75% + + + Determinate Progress - 100% + + + + Linear Progress without Percentage (50%) + + + + Linear Progress with Ping Pong + + + + + Linear Progress with Controls + +
+ -10% + +10% + Zero + Indeterminate + +
+
+ + + Changing Linear Progress through Code: 0% to 100% + + +
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat2054.tsx b/apps/prs/react/src/routes/features/feat2054.tsx new file mode 100644 index 0000000000..a05441ee86 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2054.tsx @@ -0,0 +1,146 @@ +import { type CSSProperties, JSX } from "react"; +import { + GoabBlock, + GoabDropdown, + GoabDropdownItem, + GoabText, + GoabTextArea, + GoabTooltip, +} from "@abgov/react-components"; + +interface MaxWidthExample { + label: string; + maxWidth: string; +} + +const EXAMPLES: MaxWidthExample[] = [ + { label: "maxWidth 200px", maxWidth: "200px" }, + { label: "maxWidth 60ch", maxWidth: "60ch" }, + { label: "maxWidth 50%", maxWidth: "50%" }, +]; + +const DROPDOWN_ITEMS = [ + { + label: + "Comprehensive option label designed to span the full 800px width when maxWidth allows", + value: "full-width-option", + }, + { + label: "Secondary descriptive choice reinforcing measurement comparisons", + value: "secondary-choice", + }, + { + label: "Additional entry mirroring content for consistent evaluations", + value: "tertiary-choice", + }, +]; + +const TEXTAREA_VALUE = + "This textarea content intentionally stretches across the full 800px width so the maxWidth attribute " + + "clearly demonstrates how the component constrains layout. Each example reuses the same text " + + "to make comparisons straightforward."; + +const TOOLTIP_CONTENT = + "This tooltip description mirrors the other component content. It is lengthy enough to occupy " + + "the full 800px width where permitted, making changes in maxWidth easy to compare across " + + "scenarios."; + +const demoCardStyle: CSSProperties = { + background: "#ffffff", + border: "1px solid #d6d6d6", + borderRadius: "12px", + padding: "16px", +}; + +const tooltipWrapperStyle: CSSProperties = { + width: "800px", +}; + +const tooltipTriggerStyle: CSSProperties = { + display: "inline-block", + fontWeight: 600, +}; + +export function Feat2054Route(): JSX.Element { + return ( + + + Feature 2054 - maxWidth comparison showcase + + Each example keeps content identical and only varies the maxWidth{" "} + value so you can compare how dropdowns, text areas, and tooltips respond at + three distinct sizes. + + + + + Dropdown examples + + {EXAMPLES.map((example) => ( + + {example.label} + + maxWidth set to {example.maxWidth} while width remains at 800px. Item + labels share the same text to highlight truncation and wrapping. + + + {DROPDOWN_ITEMS.map((item) => ( + + ))} + + + ))} + + + + + Textarea examples + + {EXAMPLES.map((example) => ( + + {example.label} + + The textarea width is fixed at 800px to match the dropdowns, allowing the + maxWidth value alone to dictate the rendered width. + + + + ))} + + + + + Tooltip examples + + {EXAMPLES.map((example) => ( + + {example.label} + + Tooltip content mirrors the textarea copy so the surface width shifts + solely from the maxWidth setting. + + + Hover to compare maxWidth behaviour + + + ))} + + + + ); +} diff --git a/apps/prs/react/src/routes/features/feat2267.tsx b/apps/prs/react/src/routes/features/feat2267.tsx new file mode 100644 index 0000000000..1f6a180892 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2267.tsx @@ -0,0 +1,223 @@ +import { + GoabFormItem, + GoabCheckboxList, + GoabCheckbox, + GoabText, + GoabInput, +} from "@abgov/react-components"; +import { + GoabCheckboxOnChangeDetail, + GoabCheckboxListOnChangeDetail, +} from "@abgov/ui-components-common"; +import { useState } from "react"; + +export function Feat2267Route() { + const [basicSelection, setBasicSelection] = useState([]); + const [checkboxListError, setCheckboxListError] = useState(""); + const [errorSelection, setErrorSelection] = useState([]); + const [checkboxListHasError, setCheckboxListHasError] = useState(false); + + function checkboxOnChange(event: GoabCheckboxOnChangeDetail) { + console.log(event.value); + } + + function checkboxListBasicOnChange(details: GoabCheckboxListOnChangeDetail) { + console.log(details); + setBasicSelection(details.value); + } + + function checkboxListErrorOnChange(details: GoabCheckboxListOnChangeDetail) { + console.log(details); + setErrorSelection(details.value); + if (details.value.includes("error4")) { + setCheckboxListHasError(true); + setCheckboxListError("This is an error"); + } else { + setCheckboxListHasError(false); + setCheckboxListError(""); + } + } + + return ( +
+
+ Checkbox Testing + + + + + + + + + + + + + + + + + { + /** do nothing */ + }} + value="" + /> + + } + /> + + { + /** do nothing */ + }} + value="" + /> + + } + /> + + { + /** do nothing */ + }} + value="" + /> + + } + /> + +
+
+ + checkboxListBasicOnChange(e)} + > + + + + + + +

Basic Selection: {basicSelection}

+
+ + checkboxListBasicOnChange(e)} + disabled={true} + > + + + + + + + + + checkboxListErrorOnChange(e)} + error={checkboxListHasError} + > + + + + + + +

Error Selection: {errorSelection}

+
+ + checkboxListBasicOnChange(e)} + maxWidth="200px" + > + + + + + + +

Basic Selection: {basicSelection}

+
+
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat2328.tsx b/apps/prs/react/src/routes/features/feat2328.tsx new file mode 100644 index 0000000000..db1a72c1ac --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2328.tsx @@ -0,0 +1,130 @@ +import { GoabContainer, GoabText, GoabBlock } from "@abgov/react-components"; + +export function Feat2328Route() { + return ( +
+ + Container height scenarios + + + + No maxHeight or minHeight + + + +

Basic simple text to extend to 400px width

+
+ +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare + velit. Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere + cubilia curae; Sed ornare odio odio, quis iaculis mi ultricies a. Sed + vehicula, ante sit amet porttitor sollicitudin, arcu mi pharetra enim, + aliquam posuere sapien odio in nisi. Curabitur congue odio quam, a fringilla + metus ullamcorper vel. Nulla magna urna, ultrices eu nibh ac, dictum + pulvinar justo. Nam porta massa pulvinar, congue turpis eget, finibus nulla. + Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per + conubia nostra, per inceptos himenaeos. Cras quis risus libero. +

+
+
+ + minHeight 300px or equivalent + + + +

Basic simple text to extend to 400px width

+
+ +

31ch

+

Basic simple text to extend to 400px width

+
+ +

19rem

+

Basic simple text to extend to 400px width

+
+
+ + maxHeight 300px or equivalent + + + +

Basic simple text to extend to 400px width

+
+ +

31ch

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare + velit. Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere + cubilia curae; Sed ornare odio odio, quis iaculis mi ultricies a. Sed + vehicula, ante sit amet porttitor sollicitudin, arcu mi pharetra enim, + aliquam posuere sapien odio in nisi. Curabitur congue odio quam, a fringilla + metus ullamcorper vel. Nulla magna urna, ultrices eu nibh ac, dictum + pulvinar justo. Nam porta massa pulvinar, congue turpis eget, finibus nulla. + Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per + conubia nostra, per inceptos himenaeos. Cras quis risus libero. +

+
+ +

19rem

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare + velit. Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere + cubilia curae; Sed ornare odio odio, quis iaculis mi ultricies a. Sed + vehicula, ante sit amet porttitor sollicitudin, arcu mi pharetra enim, + aliquam posuere sapien odio in nisi. Curabitur congue odio quam, a fringilla + metus ullamcorper vel. Nulla magna urna, ultrices eu nibh ac, dictum + pulvinar justo. Nam porta massa pulvinar, congue turpis eget, finibus nulla. + Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per + conubia nostra, per inceptos himenaeos. Cras quis risus libero. +

+
+
+ + + minHeight 300px and maxHeight 400px or equivalent + + + +

Basic simple text to extend to 400px width

+
+ +

31ch and 41ch

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare + velit. Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere + cubilia curae; Sed ornare odio odio, quis iaculis mi ultricies a. Sed + vehicula, ante sit amet porttitor sollicitudin, arcu mi pharetra enim, + aliquam posuere sapien odio in nisi. Curabitur congue odio quam, a fringilla + metus ullamcorper vel. Nulla magna urna, ultrices eu nibh ac, dictum + pulvinar justo. Nam porta massa pulvinar, congue turpis eget, finibus nulla. + Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per + conubia nostra, per inceptos himenaeos. Cras quis risus libero. +

+
+ +

19rem and 25rem

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at ornare + velit. Duis mi est, hendrerit sit amet eleifend nec, faucibus non nisl. + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere + cubilia curae; Sed ornare odio odio, quis iaculis mi ultricies a. Sed + vehicula, ante sit amet porttitor sollicitudin, arcu mi pharetra enim, + aliquam posuere sapien odio in nisi. Curabitur congue odio quam, a fringilla + metus ullamcorper vel. Nulla magna urna, ultrices eu nibh ac, dictum + pulvinar justo. Nam porta massa pulvinar, congue turpis eget, finibus nulla. + Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per + conubia nostra, per inceptos himenaeos. Cras quis risus libero. +

+
+
+
+
+ ); +} + +export default Feat2328Route; diff --git a/apps/prs/react/src/routes/features/feat2361.tsx b/apps/prs/react/src/routes/features/feat2361.tsx new file mode 100644 index 0000000000..bb0b90c01a --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2361.tsx @@ -0,0 +1,172 @@ +import { useMemo, useState, JSX } from "react"; +import { + GoabBlock, + GoabButton, + GoabCheckbox, + GoabCheckboxList, + GoabFormItem, + GoabGrid, + GoabRadioGroup, + GoabRadioItem, + GoabText, +} from "@abgov/react-components"; + +type SelectionOption = { + value: string; + label: string; +}; + +export function Feat2361Route(): JSX.Element { + const [errorEnabled, setErrorEnabled] = useState(false); + const [disabledEnabled, setDisabledEnabled] = useState(false); + + const errorMessage = errorEnabled + ? "Example error message for feature 2361" + : undefined; + + const horizontalOptions = useMemo( + () => [ + { value: "city", label: "City" }, + { value: "suburbs", label: "Suburbs" }, + { value: "rural", label: "Rural" }, + ], + [], + ); + + const verticalOptions = useMemo( + () => [ + { value: "bronze", label: "Bronze" }, + { value: "silver", label: "Silver" }, + { value: "gold", label: "Gold" }, + ], + [], + ); + + const checkboxListOptions = useMemo( + () => [ + { value: "flight", label: "Flight notifications" }, + { value: "hotel", label: "Hotel updates" }, + { value: "events", label: "Event reminders" }, + ], + [], + ); + + const checkboxOptions = useMemo( + () => [ + { value: "docs", label: "Enable document sync" }, + { value: "metrics", label: "Enable metrics dashboard" }, + { value: "beta", label: "Join beta features" }, + ], + [], + ); + + const emptySelection = useMemo(() => [], []); + + return ( + + + Feature 2361 - Selection control toggles + + Manual scenarios to verify the expanded clickable area on radio groups, checkbox + lists, and standalone checkboxes while sharing toggle controls. + + + + + setErrorEnabled((state) => !state)}> + {errorEnabled ? "Clear error state" : "Enable error state"} + + setDisabledEnabled((state) => !state)} + > + {disabledEnabled ? "Enable controls" : "Disable controls"} + + + + + Error state: {errorEnabled ? "on" : "off"} | Disabled:{" "} + {disabledEnabled ? "on" : "off"} + + + + + + {horizontalOptions.map((option) => ( + + ))} + + + + + + {verticalOptions.map((option) => ( + + ))} + + + + + + {checkboxListOptions.map((option) => ( + + ))} + + + + + + {checkboxOptions.map((option) => ( + + ))} + + + + + ); +} + +export default Feat2361Route; diff --git a/apps/prs/react/src/routes/features/feat2440.tsx b/apps/prs/react/src/routes/features/feat2440.tsx new file mode 100644 index 0000000000..83087ea7a8 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2440.tsx @@ -0,0 +1,20 @@ +import { GoabText } from "@abgov/react-components"; + +export function Feat2440Route() { + return ( +
+ + This element should have the id "blankID" and be the default with no tag. + + + This element should have the id "headingID" and have an "h1" tag. + + + This element should have the id "paragraphID" and have a "p" tag with a size of + "heading-m" + +
+ ); +} + +export default Feat2440Route; diff --git a/apps/prs/react/src/routes/features/feat2492.tsx b/apps/prs/react/src/routes/features/feat2492.tsx new file mode 100644 index 0000000000..f13a66ddca --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2492.tsx @@ -0,0 +1,131 @@ +import { useState, type CSSProperties, JSX } from "react"; +import { + GoabBlock, + GoabFormItem, + GoabGrid, + GoabInput, + GoabText, + GoabTextArea, +} from "@abgov/react-components"; +import { + GoabTextAreaOnBlurDetail, + GoabTextAreaOnChangeDetail, + GoabTextAreaOnKeyPressDetail, +} from "@abgov/ui-components-common"; + +const resultPanelStyle: CSSProperties = { + border: "1px solid #d6d6d6", + borderRadius: "12px", + background: "#f8f8f8", + padding: "16px", +}; + +const eventLogStyle: CSSProperties = { + border: "1px solid #d6d6d6", + borderRadius: "12px", + background: "#ffffff", + padding: "16px", +}; + +const eventHeadingStyle: CSSProperties = { + fontWeight: 600, +}; + +export function Feat2492Route(): JSX.Element { + const [lastBlurValue, setLastBlurValue] = useState(""); + const [blurCount, setBlurCount] = useState(0); + const [value, setValue] = useState(""); + const [changeLog, setChangeLog] = useState([]); + const [keyPressLog, setKeyPressLog] = useState([]); + + function handleBlur({ value }: GoabTextAreaOnBlurDetail) { + setLastBlurValue(value ?? ""); + setBlurCount((count) => count + 1); + } + + function handleChange(detail: GoabTextAreaOnChangeDetail) { + setValue(detail.value ?? ""); + setChangeLog((log) => [...log, detail].slice(-5)); + } + + function handleKeyPress(detail: GoabTextAreaOnKeyPressDetail) { + setKeyPressLog((log) => [...log, detail].slice(-8)); + } + + return ( + + + Feature 2492 - textarea blur preview + + Enter text, move focus away, and confirm the onBlur event emits the textarea + value for display below. + + + + + + Interactive example + + + + + + + + + + Captured blur details + {blurCount > 0 ? ( + <> + Blur count: {blurCount} + Last value: {lastBlurValue || "(empty text)"} + + ) : ( + + Blur the textarea to capture and render its value. + + )} + + + + Event log + Change events + {changeLog.length ? ( + changeLog.map((entry, index) => ( + + {`Change ${index + 1}: ${entry.value || "(empty text)"}`} + + )) + ) : ( + No onChange events captured yet. + )} + + Key press events + {keyPressLog.length ? ( + keyPressLog.map((entry, index) => ( + + {`Key ${index + 1}: ${entry.key} � value: ${entry.value || "(empty text)"}`} + + )) + ) : ( + No onKeyPress events captured yet. + )} + + + + + ); +} diff --git a/apps/prs/react/src/routes/features/feat2609.tsx b/apps/prs/react/src/routes/features/feat2609.tsx new file mode 100644 index 0000000000..a58814f725 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2609.tsx @@ -0,0 +1,498 @@ +import { useState } from "react"; +import { + GoabBadge, + GoabBlock, + GoabButton, + GoabCheckbox, + GoabContainer, + GoabDataGrid, + GoabDropdown, + GoabDropdownItem, + GoabLink, + GoabMenuAction, + GoabMenuButton, + GoabTable, + GoabTableSortHeader, +} from "@abgov/react-components"; + +type User = { + idNumber: string; + nameOfChild: string; + dataStarted: string; + dateSubmitted: string; + status: string; + updated: string; + email: string; + program: string; + programId: string; + serviceAccess: string; + approver: string; +}; + +const initialUsers: User[] = [ + { + idNumber: "1", + nameOfChild: "Mike Zwei", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "Removed", + updated: "Jun 30, 2022 at 2:30 PM", + email: "mike.zwei@gmail.com", + program: "Wee Wild Ones Curry", + programId: "74528567", + serviceAccess: "Claims Adjustments", + approver: "Sarah Ellis", + }, + { + idNumber: "2", + nameOfChild: "Emma Stroman", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "To be removed", + updated: "Nov 28, 2021 at 1:30 PM", + email: "emma.stroman@gmail.com", + program: "Fort McMurray", + programId: "74522643", + serviceAccess: "Claims Adjustments", + approver: "Sarah Ellis", + }, +]; + +const getStatusBadgeType = (status: string): "success" | "emergency" | "information" | "important" => { + switch (status) { + case "Removed": + return "success"; + case "To be removed": + return "emergency"; + case "Submitted": + return "information"; + case "In review": + return "information"; + case "Awaiting documentation": + return "important"; + case "Denied": + return "emergency"; + case "Approved": + return "success"; + case "Closed": + return "information"; + default: + return "information"; + } +}; + +export function Feat2609Route() { + const [users, setUsers] = useState(initialUsers); + const [selectedUsers, setSelectedUsers] = useState([]); + const [isSelectedAll, setIsSelectedAll] = useState(false); + const [nextUserId, setNextUserId] = useState(3); + + const isSelected = (userId: string): boolean => { + return selectedUsers.includes(userId); + }; + + const toggleSelection = (userId: string) => { + if (selectedUsers.includes(userId)) { + setSelectedUsers(selectedUsers.filter((id) => id !== userId)); + } else { + setSelectedUsers([...selectedUsers, userId]); + } + }; + + const selectAll = (checked: boolean) => { + setIsSelectedAll(checked); + if (checked) { + setSelectedUsers(users.map((u) => u.idNumber)); + } else { + setSelectedUsers([]); + } + }; + + const handleSort = (event: { sortBy: string; sortDir: number }) => { + const { sortBy, sortDir } = event; + const sortedUsers = [...users].sort((a: any, b: any) => (a[sortBy] > b[sortBy] ? 1 : -1) * sortDir); + setUsers(sortedUsers); + }; + + const onOpen = (userId: string) => { + alert("We are going to open a profile of this user " + userId); + }; + + const onDelete = (userId: string) => { + setUsers(users.filter((u) => u.idNumber !== userId)); + }; + + const handleMenuAction = (userId: string, action: string) => { + if (action === "open") { + onOpen(userId); + } else if (action === "delete") { + onDelete(userId); + } + }; + + const onApproverChange = (userId: string, value: string) => { + setUsers(users.map((u) => (u.idNumber === userId ? { ...u, approver: value } : u))); + }; + + const addNewRows = () => { + const newUsers: User[] = []; + let currentId = nextUserId; + for (let i = 0; i < 3; i++) { + newUsers.push({ + idNumber: String(currentId), + nameOfChild: `New User ${currentId}`, + dataStarted: "Dec 1, 2023", + dateSubmitted: "Dec 5, 2023", + status: "Submitted", + updated: "Dec 5, 2023 at 10:00 AM", + email: `user${currentId}@example.com`, + program: "Test Program", + programId: `9999${currentId}`, + serviceAccess: "Full Access", + approver: "Sarah Ellis", + }); + currentId++; + } + setNextUserId(currentId); + setUsers([...users, ...newUsers]); + }; + + const removeLastRows = () => { + if (users.length > 2) { + setUsers(users.slice(0, -3)); + } + }; + + return ( +
+

Feature #2609: Data Grid Component

+

+ This feature adds a keyboard-navigable grid wrapper component that provides ARIA-compliant accessibility for + tables and grid layouts. +

+ +

Table with Dynamic Row Addition (Testing Dropdown Focus Issue)

+ +
+ + Add 3 New Rows (Simulate Pagination) + + + Remove Last 3 Rows + + Total rows: {users.length} +
+ +

+ Test Instructions: + 1. Navigate to a cell with a dropdown (Approver column) using arrow keys. + 2. Click "Add 3 New Rows" button. + 3. Navigate to a cell with a dropdown again. + 4. Try to navigate away with arrow keys - it should take only 1 press, not 3. +

+ + + + + + + selectAll(e.checked)} + /> + + + ID + + + Name + + + Status + + Approver (Dropdown) + Actions + + + + {users.map((user) => ( + + + toggleSelection(user.idNumber)} + /> + + {user.idNumber} + {user.nameOfChild} + + + + + onApproverChange(user.idNumber, e.value ?? "")}> + + + + + + + handleMenuAction(user.idNumber, e.action)} + > + + + + + + ))} + + + + +

Containers (Layout Mode)

+

Layout mode allows arrow keys to wrap between rows when reaching the edge.

+ + {users.map((user) => ( + + + toggleSelection(user.idNumber)} + /> + +
+ + + {user.nameOfChild} + + + + + + + + + Updated + {user.updated} + + + Program ID + {user.programId} + + + + + + Email + {user.email} + + + Service access + {user.serviceAccess} + + + + + + Program + {user.program} + + + Approver + onApproverChange(user.idNumber, e.value ?? "")} + > + + + + + + + + +
+ + handleMenuAction(user.idNumber, e.action)} + > + + + +
+
+ ))} +
+ +

Table with Colspan and Different Column Counts

+

+ This table tests navigation with varying column counts and colspan attributes. Use arrow keys to navigate and + observe focus behavior. +

+ + + + + Column 1 + Column 2 + Column 3 + Column 4 + Column 5 + + + + + Row 1, Cell 1 + Row 1, Cell 2 + Row 1, Cell 3 + Row 1, Cell 4 + Row 1, Cell 5 + + + Row 2, Cell 1 + + Row 2, Cell 2 (spans 2 cols) + + + Row 2, Cell 3 (spans 2 cols) + + + + + Row 3, Cell 1 (spans 3 cols) + + + Row 3, Cell 2 (spans 2 cols) + + + + Row 4, Cell 1 + Row 4, Cell 2 + Row 4, Cell 3 + Row 4, Cell 4 + Row 4, Cell 5 + + + + Row 5, Single Cell (spans all 5 cols) + + + + + + +

Keyboard Icon Options

+

+ The keyboard navigation icon can be customized with keyboardIconVisibility and{" "} + keyboardIconPosition props. +

+ +

Icon Position: Left (Default)

+

+ keyboardIconPosition="left" - Icon appears in the bottom-left corner when navigating. +

+ + + + + Name + Role + Status + + + + + Alice Johnson + Developer + Active + + + Bob Smith + Designer + Active + + + + + +

Icon Position: Right

+

+ keyboardIconPosition="right" - Icon appears in the bottom-right corner when navigating. +

+ + + + + Name + Role + Status + + + + + Carol White + Manager + Active + + + David Brown + Analyst + Active + + + + + +

Icon Visibility: Hidden

+

+ keyboardIconVisibility="hidden" - Keyboard navigation still works but the icon is not shown. +

+ + + + ARIA 1.1 Specification + + + Core Accessibility API Mappings 1.1 + + + WAI-ARIA Overview + + + WCAG Overview + + + + +

Icon Visibility: Visible (Default)

+

+ keyboardIconVisibility="visible" - The keyboard icon is shown when navigating (default behavior). +

+ + + + Button 1 + + + Button 2 + + + Button 3 + + + +
+ ); +} + +export default Feat2609Route; diff --git a/apps/prs/react/src/routes/features/feat2611-tabs-disabled.tsx b/apps/prs/react/src/routes/features/feat2611-tabs-disabled.tsx new file mode 100644 index 0000000000..ff133ddbd6 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2611-tabs-disabled.tsx @@ -0,0 +1,82 @@ +import { GoabTabs, GoabTab, GoabButtonGroup, GoabButton } from "@abgov/react-components"; + +export default function Feat2611TabsDisabled() { + const setHash = (hash: string) => { + window.location.hash = `#${hash}`; + }; + + const clearHash = () => { + window.history.replaceState( + {}, + "", + window.location.pathname + window.location.search, + ); + }; + + return ( +
+

Feature 2611 - Disabled Tab Edge Cases

+ +

Test Case 1: initialTab=1 with first tab disabled

+

Expected: Tab 2 should be selected (first enabled tab), not Tab 1 (disabled)

+ + +

Content 1 - This should NOT be visible

+
+ +

Content 2 - This SHOULD be visible on load

+
+ +

Content 3

+
+
+ +

Test Case 2: no initialTab with first tab disabled

+

+ Expected: Tab 2 should be selected (first enabled tab), not Tab 1 (disabled), even + without initialTab. +

+ + +

Content 1 - This should NOT be visible

+
+ +

Content 2 - This SHOULD be visible on load

+
+ +

Content 3

+
+
+ +

Test Case 3: hash change to disabled tab

+

+ Expected: If the hash is set to a disabled tab (for example #tab-0), selection + should not move to the disabled tab. The URL should ideally normalize back to the + current enabled tab hash. +

+ + setHash("tab-0")}> + Set hash to #tab-0 (disabled) + + setHash("tab-1")}> + Set hash to #tab-1 (enabled) + + setHash("tab-2")}> + Set hash to #tab-2 (enabled) + + Clear hash + + + +

Content A - This should NOT be visible

+
+ +

Content B - This SHOULD stay visible when hash targets disabled tab

+
+ +

Content C - Should also stay visible if hash is changed to disabled tab

+
+
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat2611.tsx b/apps/prs/react/src/routes/features/feat2611.tsx new file mode 100644 index 0000000000..e2a4db747d --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2611.tsx @@ -0,0 +1,399 @@ +import { useState } from "react"; +import { + GoabTabs, + GoabTab, + GoabBlock, + GoabText, + GoabBadge, + GoabButton, + GoabButtonGroup, +} from "@abgov/react-components"; +import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; + +export function Feat2611Route() { + const [activeTab, setActiveTab] = useState(1); + const [dynamicLabel, setDynamicLabel] = useState("Overview"); + const [dynamicBadge, setDynamicBadge] = useState("3"); + + const handleTabChange = (detail: GoabTabsOnChangeDetail) => { + console.log("Tab changed:", detail); + setActiveTab(detail.tab); + }; + + const toggleDynamicLabel = () => { + setDynamicLabel((prev) => + prev === "Overview" ? "Overview with a much longer label" : "Overview", + ); + }; + + const toggleDynamicBadge = () => { + setDynamicBadge((prev) => (prev === "3" ? "Text Based Content" : "3")); + }; + + return ( +
+

Segmented Tabs Variant (#2611)

+

+ This feature adds a new "segmented" variant to the Tabs component, featuring a + pill/button style with animated sliding background. +

+ + +
+

Segmented Variant

+

Tabs with pill-style appearance and animated selection indicator.

+ + + + Overview + + } + > + + + This is the Overview tab content. The segmented variant displays tabs as + pill-shaped buttons with a sliding background indicator. + + + + + Details + + } + > + + + This is the Details tab content. Notice how the pill smoothly animates + between tabs. + + + + + Settings + + } + > + + + This is the Settings tab content. The segmented style is ideal for + compact navigation within a section. + + + + +
+ +
+

Segmented Variant - Dynamic Heading Updates

+

+ Use the controls to change heading content; the pill should resize and stay + aligned after each update. +

+ + + Toggle label length + Toggle badge content + + + + + {dynamicLabel} + + } + > + + This tab heading changes length and badge content for resize testing. + + + + Static label for comparison. + + + Another static label. + + +
+ +
+

Default Variant (for comparison)

+

Standard tabs with underline indicator.

+ + + + {dynamicLabel} + + } + > + + + This is the Overview tab with the default variant styling. + + + + + Details + + } + > + + + This is the Details tab with the default variant styling. + + + + + Settings + + } + > + + + This is the Settings tab with the default variant styling. + + + + +
+ +
+

Long Labels - Segmented Variant

+

Demonstrates how long tab labels are handled in the segmented variant.

+ + + + Short label tab content. + + + Medium length label tab content. + + + Very long label tab content. + + + Long with Badge + + } + > + Long label with badge tab content. + + +
+ +
+

Long Labels - Default Variant

+

Demonstrates how long tab labels are handled in the default variant.

+ + + + Short label tab content. + + + Medium length label tab content. + + + Very long label tab content. + + + Long with Badge + + } + > + Long label with badge tab content. + + +
+ +
+

Multi-Line Labels - Segmented Variant

+

Demonstrates using React nodes to create multi-line tab headings.

+ + + + Line One +
+ Line Two + + } + > + Multi-line heading tab content. +
+ + Primary Text +
+ Secondary Text + + } + > + Primary/secondary text pattern tab content. +
+ + Orders +
+ + + } + > + Label with badge on second line. +
+
+
+ +
+

Multi-Line Labels - Default Variant

+

Demonstrates using React nodes to create multi-line tab headings.

+ + + + Line One +
+ Line Two + + } + > + Multi-line heading tab content. +
+ + Primary Text +
+ Secondary Text + + } + > + Primary/secondary text pattern tab content. +
+ + Orders +
+ + + } + > + Label with badge on second line. +
+
+
+ +
+

Disabled Tabs - Segmented Variant

+

Demonstrates disabled tabs that cannot be clicked or navigated to.

+ + + + This tab is enabled and can be selected. + + + This content should not be visible (tab is disabled). + + + + This tab is also enabled. Keyboard navigation skips the disabled tab. + + + + Disabled with Badge + + } + disabled + > + Disabled tab with badge - not accessible. + + +
+ +
+

Disabled Tabs - Default Variant

+

Demonstrates disabled tabs in the default variant.

+ + + + This tab is enabled and can be selected. + + + This content should not be visible (tab is disabled). + + + + This tab is also enabled. Keyboard navigation skips the disabled tab. + + + + Disabled with Badge + + } + disabled + > + Disabled tab with badge - not accessible. + + +
+ +
+

Active Tab State

+ + Current active tab: {activeTab} + +
+ +
+

Feature Summary

+ + + variant="segmented" - Pill-style tabs with animated sliding + background + + + variant="default" - Standard underline-style tabs (default + behavior) + + + heading - Supports React nodes (e.g., text with badges) + + + disabled - Prevents tab selection, grayed out appearance, + skipped in keyboard navigation + + +
+
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat2682.tsx b/apps/prs/react/src/routes/features/feat2682.tsx new file mode 100644 index 0000000000..380a1468b6 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2682.tsx @@ -0,0 +1,103 @@ +import React from "react"; +import { GoabFormItem } from "@abgov/react-components"; +import { GoabDatePicker } from "@abgov/react-components"; +import { GoabBlock } from "@abgov/react-components"; +import { GoabText } from "@abgov/react-components"; +import { GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; + +export function Feat2682Route() { + const handleDateChange = (detail: GoabDatePickerOnChangeDetail) => { + console.log("DatePicker onChange event:", detail); + }; + + // Calculate min and max dates (one month before and after today) + const today = new Date(); + const minDate = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate()); + const maxDate = new Date(today.getFullYear(), today.getMonth() + 1, today.getDate()); + + return ( + + + Feature 2682 - DatePicker Manual Testing + + + + This test demonstrates various DatePicker configurations with FormItem wrappers. + Check the browser console for onChange events. + + + {/* Test 1: Default DatePicker */} + + + + + {/* Test 2: Disabled DatePicker */} + + + + + {/* Test 3: Input type DatePicker */} + + + + + {/* Test 4: Input type and disabled DatePicker */} + + + + + {/* Test 5: DatePicker with min and max dates */} + + + + + {/* Test 6: Input type DatePicker with min and max dates */} + + + + + {/* Test 7: DatePicker with error=true */} + + + + + {/* Test 8: Input type DatePicker with error=true */} + + + + + ); +} diff --git a/apps/prs/react/src/routes/features/feat2722.tsx b/apps/prs/react/src/routes/features/feat2722.tsx new file mode 100644 index 0000000000..d9a2f22f2b --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2722.tsx @@ -0,0 +1,174 @@ +import { useState } from "react"; +import { + GoabInput, + GoabInputNumber, + GoabBlock, + GoabText, + GoabFormItem, +} from "@abgov/react-components"; +import { GoabInputOnChangeDetail } from "@abgov/ui-components-common"; + +export function Feat2722Route() { + const [textValue, setTextValue] = useState("Sample text input"); + const [numberValue, setNumberValue] = useState(12345.67); + const [currencyValue, setCurrencyValue] = useState(99.99); + const [percentageValue, setPercentageValue] = useState(85.5); + + const onTextChange = (details: GoabInputOnChangeDetail) => { + console.log("Text changed:", details); + setTextValue(details.value); + }; + + const onNumberChange = (details: GoabInputOnChangeDetail) => { + console.log("Number changed:", details); + setNumberValue(details.value); + }; + + const onCurrencyChange = (details: GoabInputOnChangeDetail) => { + console.log("Currency changed:", details); + setCurrencyValue(details.value); + }; + + const onPercentageChange = (details: GoabInputOnChangeDetail) => { + console.log("Percentage changed:", details); + setPercentageValue(details.value); + }; + + return ( +
+

Input Text Alignment Feature Test

+

Testing the textAlign property functionality for input components

+ + +

Text Input Alignment

+

Testing left vs right alignment for text inputs

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

Number Input Alignment

+

Number inputs default to right alignment for better readability

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

Currency and Percentage Examples

+

Demonstrating right alignment for financial and percentage data

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

Test Results

+ + + Text Value: {textValue || "None"} + + + Number Value: {numberValue || "None"} + + + Currency Value: ${currencyValue || "None"} + + + Percentage Value: {percentageValue || "None"}% + + + +

Feature Summary

+ + + ✅ textAlign="left" - Text is left-aligned (default for text + inputs) + + + ✅ textAlign="right" - Text is right-aligned (default for + number inputs) + + + ✅ Number inputs default to right alignment for better + numeric readability + + + ✅ Currency and percentage inputs benefit from right + alignment + + +
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat2730.tsx b/apps/prs/react/src/routes/features/feat2730.tsx new file mode 100644 index 0000000000..8fe44b708f --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2730.tsx @@ -0,0 +1,493 @@ +import { useState, useEffect } from "react"; +import { + GoabButton, + GoabBlock, + GoabText, + GoabFormItem, + GoabInput, + GoabDropdown, + GoabDropdownItem, + GoabTemporaryNotificationCtrl, +} from "@abgov/react-components"; +import { + TemporaryNotification, + GoabDropdownOnChangeDetail, +} from "@abgov/ui-components-common"; + +export function Feat2730Route() { + // Controller positioning + const [verticalPosition, setVerticalPosition] = useState<"top" | "bottom">("bottom"); + const [horizontalPosition, setHorizontalPosition] = useState< + "left" | "center" | "right" + >("center"); + + // Notification settings + const [message, setMessage] = useState("This is a test notification message"); + const [notificationType, setNotificationType] = useState< + "basic" | "success" | "failure" | "indeterminate" | "progress" + >("basic"); + const [duration, setDuration] = useState(4000); + const [actionText, setActionText] = useState(""); + const [progressValue, setProgressValue] = useState(0); + + // Progress simulation + const [progressInterval, setProgressInterval] = useState(null); + const [currentProgressUuid, setCurrentProgressUuid] = useState(""); + + // Test results + const [lastNotificationUuid, setLastNotificationUuid] = useState(""); + const [notificationHistory, setNotificationHistory] = useState< + Array<{ + uuid: string; + message: string; + type: string; + timestamp: Date; + }> + >([]); + + useEffect(() => { + // Initialize with a welcome message + showWelcomeNotification(); + }, []); + + // Utility function to track notifications + const trackNotification = (uuid: string, message: string, type: string) => { + setLastNotificationUuid(uuid); + setNotificationHistory((prev) => { + const newHistory = [ + { + uuid, + message, + type, + timestamp: new Date(), + }, + ...prev, + ]; + // Keep only last 10 notifications + return newHistory.slice(0, 10); + }); + }; + + // Basic notification tests + const showBasicNotification = () => { + const uuid = TemporaryNotification.show(message, { + type: "basic", + duration: duration, + actionText: actionText || undefined, + }); + trackNotification(uuid, message, "basic"); + }; + + const showSuccessNotification = () => { + const uuid = TemporaryNotification.show("Operation completed successfully!", { + type: "success", + duration: duration, + }); + trackNotification(uuid, "Operation completed successfully!", "success"); + }; + + const showFailureNotification = () => { + const uuid = TemporaryNotification.show( + "An error occurred while processing your request.", + { + type: "failure", + duration: duration, + }, + ); + trackNotification( + uuid, + "An error occurred while processing your request.", + "failure", + ); + }; + + const showIndeterminateNotification = () => { + const uuid = TemporaryNotification.show("Processing your request...", { + type: "indeterminate", + duration: duration, + }); + trackNotification(uuid, "Processing your request...", "indeterminate"); + }; + + // Progress notification tests + const startProgressNotification = () => { + setProgressValue(0); + const uuid = TemporaryNotification.show("Uploading files...", { + type: "progress", + duration: undefined, // No auto-dismiss for progress + }); + setCurrentProgressUuid(uuid); + trackNotification(uuid, "Uploading files...", "progress"); + + // Simulate progress updates + const interval = setInterval(() => { + setProgressValue((prev) => { + const newValue = prev + 10; + TemporaryNotification.setProgress(uuid, newValue); + + if (newValue >= 100) { + clearInterval(interval); + setProgressValue(0); + setCurrentProgressUuid(""); + } + return newValue; + }); + }, 500); + setProgressInterval(interval); + }; + + const stopProgressNotification = () => { + if (progressInterval) { + clearInterval(progressInterval); + setProgressValue(0); + setCurrentProgressUuid(""); + setProgressInterval(null); + } + }; + + // Queue testing + const showMultipleNotifications = () => { + const messages = [ + "First notification in queue", + "Second notification in queue", + "Third notification in queue", + "Fourth notification in queue", + "Fifth notification in queue", + ]; + + messages.forEach((msg, index) => { + setTimeout(() => { + const uuid = TemporaryNotification.show(msg, { + type: "basic", + duration: 2000, + }); + trackNotification(uuid, msg, "basic"); + }, index * 500); + }); + }; + + // Action testing + const showNotificationWithAction = () => { + const uuid = TemporaryNotification.show("Would you like to undo this action?", { + type: "basic", + duration: 8000, + actionText: "Undo", + action: () => { + console.log("Undo action clicked!"); + TemporaryNotification.show("Action undone successfully!", { + type: "success", + duration: 3000, + }); + }, + }); + trackNotification(uuid, "Would you like to undo this action?", "basic with action"); + }; + + // Cancel/replace testing + const showCancellableNotification = () => { + const uuid = TemporaryNotification.show("This notification can be cancelled", { + type: "basic", + duration: 10000, + }); + setLastNotificationUuid(uuid); + trackNotification(uuid, "This notification can be cancelled", "basic"); + }; + + const cancelLastNotification = () => { + if (lastNotificationUuid) { + TemporaryNotification.show("Previous notification cancelled", { + type: "success", + cancelUUID: lastNotificationUuid, + duration: 3000, + }); + setLastNotificationUuid(""); + } + }; + + // Welcome notification + const showWelcomeNotification = () => { + const uuid = TemporaryNotification.show( + "Welcome to the Temporary Notification test page! 🎉", + { + type: "success", + duration: 5000, + }, + ); + trackNotification( + uuid, + "Welcome to the Temporary Notification test page! 🎉", + "success", + ); + }; + + const clearHistory = () => { + setNotificationHistory([]); + }; + + // Duration presets + const setDurationShort = () => setDuration(2000); + const setDurationMedium = () => setDuration(4000); + const setDurationLong = () => setDuration(6000); + const setDurationCustom = () => setDuration(8000); + + // Dropdown change handlers + const onVerticalPositionChange = (details: GoabDropdownOnChangeDetail) => { + setVerticalPosition(details.value as "top" | "bottom"); + }; + + const onHorizontalPositionChange = (details: GoabDropdownOnChangeDetail) => { + setHorizontalPosition(details.value as "left" | "center" | "right"); + }; + + return ( +
+

Temporary Notification Feature Test (Issue #2730)

+

Testing the new temporary notification component and controller functionality

+ + {/* Controller Setup */} + + + + {/* Controller Positioning */} +

Controller Positioning

+

Configure where notifications appear on the screen

+ + + + + + + + + + + + + + + + + + + {/* Notification Configuration */} +

Notification Configuration

+

Customize notification settings

+ + + + setMessage(details.value)} + testId="message-input" + placeholder="Enter notification message..." + /> + + + + setDuration(+details.value)} + testId="duration-input" + type="number" + placeholder="4000" + /> + + + + + + setActionText(details.value)} + testId="action-text-input" + placeholder="e.g., Undo, Retry, etc." + /> + + + + + + Short (2s) + + + Medium (4s) + + + Long (6s) + + + Custom (8s) + + + + + + {/* Basic Notification Tests */} +

Basic Notification Tests

+

Test different notification types and behaviors

+ + + + Show Basic Notification + + + Show Success Notification + + + Show Failure Notification + + + + + + Show Indeterminate Notification + + + Show Notification with Action + + + + {/* Progress Notification Tests */} +

Progress Notification Tests

+

Test determinate and indeterminate progress indicators

+ + + + Start Progress Notification + + + Stop Progress + + + + {currentProgressUuid && ( + + + Current Progress: {progressValue}% + + + Progress UUID: {currentProgressUuid} + + + )} + + {/* Queue Testing */} +

Queue Testing

+

Test multiple notifications in queue (FIFO order)

+ + + + Show 5 Notifications in Queue + + + + {/* Cancel/Replace Testing */} +

Cancel/Replace Testing

+

Test cancelling and replacing notifications

+ + + + Show Cancellable Notification + + + Cancel Last Notification + + + + {/* Test Results */} +

Test Results

+

Track notification history and UUIDs

+ + + + Last Notification UUID: {lastNotificationUuid || "None"} + + + Clear History + + + +

Notification History (Last 10)

+ + {notificationHistory.map((notification, index) => ( +
+ + {notification.timestamp.toLocaleTimeString()} -{" "} + {notification.type}: {notification.message} + + UUID: {notification.uuid} +
+ ))} + {notificationHistory.length === 0 && ( + + No notifications yet. Try clicking some buttons above! + + )} +
+ + {/* Feature Summary */} +

Feature Summary

+ + + ✅ Controller System - Centralized notification management + + + ✅ Flexible Positioning - Top/bottom, left/center/right + positioning + + + ✅ Multiple Types - Basic, success, failure, indeterminate, + progress + + + ✅ Progress Tracking - Determinate (0-100) and indeterminate + progress + + + ✅ Queue Management - FIFO order for multiple notifications + + + ✅ Action Buttons - Custom actions for basic notifications + + + ✅ Cancel/Replace - Cancel existing notifications with new + ones + + + ✅ Auto-dismiss - Configurable duration with presets + + + ✅ Animation - Smooth slide animations based on position + + + ✅ Accessibility - Proper ARIA attributes and screen reader + support + + +
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat2829.tsx b/apps/prs/react/src/routes/features/feat2829.tsx new file mode 100644 index 0000000000..a4f24c73f3 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2829.tsx @@ -0,0 +1,426 @@ +import React, { useState } from "react"; +import { + GoabButton, + GoabModal, + GoabText, + GoabInput, + GoabFormItem, +} from "@abgov/react-components"; + +export function Feat2829Route() { + const [isModalOpen, setIsModalOpen] = useState(false); + const [isAlertModalOpen, setIsAlertModalOpen] = useState(false); + + const openModal = () => { + setIsModalOpen(true); + }; + + const closeModal = () => { + setIsModalOpen(false); + }; + + const openAlertModal = () => { + setIsAlertModalOpen(true); + }; + + const closeAlertModal = () => { + setIsAlertModalOpen(false); + }; + + return ( +
+

Feature 2829: Modal with Scrolling Content

+ +

+ This feature demonstrates a modal with extensive content that requires scrolling + on a 4K screen. +

+ + + Open Modal (Dialog) + + + + Open Modal (Alert Dialog) + + + + {/* Extensive content to fill 4K screen */} + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis + nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. + + + + Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium + doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore + veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam + voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia + consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. + + + + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, + adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et + dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum + exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi + consequatur? + + + + Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil + molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla + pariatur? At vero eos et accusamus et iusto odio dignissimos ducimus qui + blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas + molestias excepturi sint occaecati cupiditate non provident. + + + + Similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et + dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam + libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo + minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, + omnis dolor repellendus. + + + + Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus + saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. + Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis + voluptatibus maiores alias consequatur aut perferendis doloribus asperiores + repellat. + + + + On the other hand, we denounce with righteous indignation and dislike men who + are so beguiled and demoralized by the charms of pleasure of the moment, so + blinded by desire, that they cannot foresee the pain and trouble that are bound + to ensue; and equal blame belongs to those who fail in their duty through + weakness of will, which is the same as saying through shrinking from toil and + pain. + + + + These cases are perfectly simple and easy to distinguish. In a free hour, when + our power of choice is untrammelled and when nothing prevents our being able to + do what we like best, every pleasure is to be welcomed and every pain avoided. + But in certain circumstances and owing to the claims of duty or the obligations + of business it will frequently occur that pleasures have to be repudiated and + annoyances accepted. + + + + The wise man therefore always holds in these matters to this principle of + selection: he rejects pleasures to secure other greater pleasures, or else he + endures pains to avoid worse pains. But I must explain to you how all this + mistaken idea of denouncing pleasure and praising pain was born and I will give + you a complete account of the system, and expound the actual teachings of the + great explorer of the truth. + + + + The master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know how + to pursue pleasure rationally encounter consequences that are extremely painful. + Nor again is there anyone who loves or pursues or desires to obtain pain of + itself, because it is pain, but because occasionally circumstances occur in + which toil and pain can procure him some great pleasure. + + + {/* Middle Input */} + + + + + + To take a trivial example, which of us ever undertakes laborious physical + exercise, except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying + consequences, or one who avoids a pain that produces no resultant pleasure? On + the other hand, we denounce with righteous indignation and dislike men who are + so beguiled and demoralized by the charms of pleasure of the moment. + + + + So blinded by desire, that they cannot foresee the pain and trouble that are + bound to ensue; and equal blame belongs to those who fail in their duty through + weakness of will, which is the same as saying through shrinking from toil and + pain. These cases are perfectly simple and easy to distinguish. In a free hour, + when our power of choice is untrammelled and when nothing prevents our being + able to do what we like best. + + + + Every pleasure is to be welcomed and every pain avoided. But in certain + circumstances and owing to the claims of duty or the obligations of business it + will frequently occur that pleasures have to be repudiated and annoyances + accepted. The wise man therefore always holds in these matters to this principle + of selection: he rejects pleasures to secure other greater pleasures, or else he + endures pains to avoid worse pains. + + + + But I must explain to you how all this mistaken idea of denouncing pleasure and + praising pain was born and I will give you a complete account of the system, and + expound the actual teachings of the great explorer of the truth, the + master-builder of human happiness. No one rejects, dislikes, or avoids pleasure + itself, because it is pleasure, but because those who do not know how to pursue + pleasure rationally encounter consequences that are extremely painful. + + + + Nor again is there anyone who loves or pursues or desires to obtain pain of + itself, because it is pain, but because occasionally circumstances occur in + which toil and pain can procure him some great pleasure. To take a trivial + example, which of us ever undertakes laborious physical exercise, except to + obtain some advantage from it? But who has any right to find fault with a man + who chooses to enjoy a pleasure that has no annoying consequences. + + + + Or one who avoids a pain that produces no resultant pleasure? On the other hand, + we denounce with righteous indignation and dislike men who are so beguiled and + demoralized by the charms of pleasure of the moment, so blinded by desire, that + they cannot foresee the pain and trouble that are bound to ensue; and equal + blame belongs to those who fail in their duty through weakness of will. + + + + Which is the same as saying through shrinking from toil and pain. These cases + are perfectly simple and easy to distinguish. In a free hour, when our power of + choice is untrammelled and when nothing prevents our being able to do what we + like best, every pleasure is to be welcomed and every pain avoided. But in + certain circumstances and owing to the claims of duty or the obligations of + business it will frequently occur that pleasures have to be repudiated and + annoyances accepted. + + + + The wise man therefore always holds in these matters to this principle of + selection: he rejects pleasures to secure other greater pleasures, or else he + endures pains to avoid worse pains. But I must explain to you how all this + mistaken idea of denouncing pleasure and praising pain was born and I will give + you a complete account of the system, and expound the actual teachings of the + great explorer of the truth. + + + {/* Bottom Input */} + + + + + {/* Actions slot for close button */} +
+ + Close Modal + +
+
+ + + {/* Extensive content to fill 4K screen */} + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis + nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. + + + + Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium + doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore + veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam + voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia + consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. + + + + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, + adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et + dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum + exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi + consequatur? + + + + Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil + molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla + pariatur? At vero eos et accusamus et iusto odio dignissimos ducimus qui + blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas + molestias excepturi sint occaecati cupiditate non provident. + + + + Similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et + dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam + libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo + minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, + omnis dolor repellendus. + + + + Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus + saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. + Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis + voluptatibus maiores alias consequatur aut perferendis doloribus asperiores + repellat. + + + + On the other hand, we denounce with righteous indignation and dislike men who + are so beguiled and demoralized by the charms of pleasure of the moment, so + blinded by desire, that they cannot foresee the pain and trouble that are bound + to ensue; and equal blame belongs to those who fail in their duty through + weakness of will, which is the same as saying through shrinking from toil and + pain. + + + + These cases are perfectly simple and easy to distinguish. In a free hour, when + our power of choice is untrammelled and when nothing prevents our being able to + do what we like best, every pleasure is to be welcomed and every pain avoided. + But in certain circumstances and owing to the claims of duty or the obligations + of business it will frequently occur that pleasures have to be repudiated and + annoyances accepted. + + + + The wise man therefore always holds in these matters to this principle of + selection: he rejects pleasures to secure other greater pleasures, or else he + endures pains to avoid worse pains. But I must explain to you how all this + mistaken idea of denouncing pleasure and praising pain was born and I will give + you a complete account of the system, and expound the actual teachings of the + great explorer of the truth. + + + + The master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know how + to pursue pleasure rationally encounter consequences that are extremely painful. + Nor again is there anyone who loves or pursues or desires to obtain pain of + itself, because it is pain, but because occasionally circumstances occur in + which toil and pain can procure him some great pleasure. + + + {/* Middle Input */} + + + + + + To take a trivial example, which of us ever undertakes laborious physical + exercise, except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying + consequences, or one who avoids a pain that produces no resultant pleasure? On + the other hand, we denounce with righteous indignation and dislike men who are + so beguiled and demoralized by the charms of pleasure of the moment. + + + + So blinded by desire, that they cannot foresee the pain and trouble that are + bound to ensue; and equal blame belongs to those who fail in their duty through + weakness of will, which is the same as saying through shrinking from toil and + pain. These cases are perfectly simple and easy to distinguish. In a free hour, + when our power of choice is untrammelled and when nothing prevents our being + able to do what we like best. + + + + Every pleasure is to be welcomed and every pain avoided. But in certain + circumstances and owing to the claims of duty or the obligations of business it + will frequently occur that pleasures have to be repudiated and annoyances + accepted. The wise man therefore always holds in these matters to this principle + of selection: he rejects pleasures to secure other greater pleasures, or else he + endures pains to avoid worse pains. + + + + But I must explain to you how all this mistaken idea of denouncing pleasure and + praising pain was born and I will give you a complete account of the system, and + expound the actual teachings of the great explorer of the truth, the + master-builder of human happiness. No one rejects, dislikes, or avoids pleasure + itself, because it is pleasure, but because those who do not know how to pursue + pleasure rationally encounter consequences that are extremely painful. + + + + Nor again is there anyone who loves or pursues or desires to obtain pain of + itself, because it is pain, but because occasionally circumstances occur in + which toil and pain can procure him some great pleasure. To take a trivial + example, which of us ever undertakes laborious physical exercise, except to + obtain some advantage from it? But who has any right to find fault with a man + who chooses to enjoy a pleasure that has no annoying consequences. + + + + Or one who avoids a pain that produces no resultant pleasure? On the other hand, + we denounce with righteous indignation and dislike men who are so beguiled and + demoralized by the charms of pleasure of the moment, so blinded by desire, that + they cannot foresee the pain and trouble that are bound to ensue; and equal + blame belongs to those who fail in their duty through weakness of will. + + + + Which is the same as saying through shrinking from toil and pain. These cases + are perfectly simple and easy to distinguish. In a free hour, when our power of + choice is untrammelled and when nothing prevents our being able to do what we + like best, every pleasure is to be welcomed and every pain avoided. But in + certain circumstances and owing to the claims of duty or the obligations of + business it will frequently occur that pleasures have to be repudiated and + annoyances accepted. + + + + The wise man therefore always holds in these matters to this principle of + selection: he rejects pleasures to secure other greater pleasures, or else he + endures pains to avoid worse pains. But I must explain to you how all this + mistaken idea of denouncing pleasure and praising pain was born and I will give + you a complete account of the system, and expound the actual teachings of the + great explorer of the truth. + + + {/* Bottom Input */} + + + + + {/* Actions slot for close button */} +
+ + Close Modal + +
+
+
+ ); +} diff --git a/apps/prs/react/src/routes/features/feat2877.tsx b/apps/prs/react/src/routes/features/feat2877.tsx new file mode 100644 index 0000000000..3a49d40801 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat2877.tsx @@ -0,0 +1,152 @@ +import React from "react"; +import { + GoabBadge, + // GoabLink, + GoabBlock, + GoabText, + GoabOneColumnLayout, + GoabPageBlock, + GoabDivider, +} from "@abgov/react-components"; +import { Link } from "react-router-dom"; + +export function Feat2877Route() { + return ( + + + + + Back + + + PR 2877 - Badge Icon Property Testing + + + + + {/* Critical Test Cases for the Fix */} + + Icon Boolean Handling + + + + + Test 1: icon={true} - Should show icon + + + + + Test 2: icon={false} - Should NOT show icon + + + + + Test 3: icon prop not provided - Should NOT show icon (default behavior) + + + + + Test 4: icon={undefined} - Should NOT show icon (same as not + provided) + + + + + + + {/* Custom Icon Type Tests */} + + Custom Icon Type Tests + + + + + Test 5: iconType="home" (no icon prop) - Should show custom home icon + + + + + Test 6: iconType="star" + icon={false} - Should hide icon (false + overrides iconType) + + + + + Test 7: iconType="star" + icon={true} - Should show custom star + icon + + + + + + + {/* New Badge Types */} + + New Badge Types + + + + + + + + + + + + + + + + + + Light Variants + + + + + + + + + + + + + + + + + {/* Edge Cases */} + + Edge Cases + + + + + Badge with no content (icon only) + + + + + Badge with no content and icon={false} + + + + + Badge with custom icon and no content + + + + + + + + + ); +} diff --git a/apps/prs/react/src/routes/features/feat3102.tsx b/apps/prs/react/src/routes/features/feat3102.tsx new file mode 100644 index 0000000000..0658979538 --- /dev/null +++ b/apps/prs/react/src/routes/features/feat3102.tsx @@ -0,0 +1,47 @@ +import { + GoabBlock, + GoabDivider, + GoabMenuAction, + GoabMenuButton, + GoabText, +} from "@abgov/react-components"; +import type { GoabMenuButtonOnActionDetail } from "@abgov/ui-components-common"; + +export default function TestComponent() { + const onAction = (detail: GoabMenuButtonOnActionDetail) => { + console.log(detail); + }; + + return ( + + + + + 3102 + {" "} + - Allow icon to be set on MenuButton + + + All the MenuButton to have a leading icon set + + + + + + + + + + + + + ); +} diff --git a/apps/prs/react/src/styles.css b/apps/prs/react/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/apps/prs/react/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/apps/prs/react/tsconfig.app.json b/apps/prs/react/tsconfig.app.json new file mode 100644 index 0000000000..2a5ff5ebd5 --- /dev/null +++ b/apps/prs/react/tsconfig.app.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "types": [ + "node", + "@nx/react/typings/cssmodule.d.ts", + "@nx/react/typings/image.d.ts", + "vite/client" + ] + }, + "exclude": [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.spec.tsx", + "src/**/*.test.tsx", + "src/**/*.spec.js", + "src/**/*.test.js", + "src/**/*.spec.jsx", + "src/**/*.test.jsx" + ], + "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] +} diff --git a/apps/prs/react/tsconfig.json b/apps/prs/react/tsconfig.json new file mode 100644 index 0000000000..4467b39320 --- /dev/null +++ b/apps/prs/react/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "types": ["vite/client"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + } + ], + "extends": "../../../tsconfig.base.json" +} diff --git a/apps/prs/react/vite.config.ts b/apps/prs/react/vite.config.ts new file mode 100644 index 0000000000..f77894c6f3 --- /dev/null +++ b/apps/prs/react/vite.config.ts @@ -0,0 +1,43 @@ +/// +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin"; + +export default defineConfig({ + root: __dirname, + cacheDir: "../../../node_modules/.vite/playground/react", + + server: { + port: 4201, + host: "0.0.0.0", + // Enable SPA fallback for client-side routing + historyApiFallback: true, + }, + + preview: { + port: 4300, + host: "localhost", + // Enable SPA fallback in preview mode too + historyApiFallback: true, + }, + + plugins: [react(), nxViteTsPaths()], + + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + + build: { + outDir: "../../../dist/apps/prs/react", + reportCompressedSize: true, + minify: false, + commonjsOptions: { + transformMixedEsModules: true, + }, + }, + + define: { + "import.meta.vitest": undefined, + }, +}); diff --git a/apps/prs/web/.babelrc b/apps/prs/web/.babelrc new file mode 100644 index 0000000000..f2f3806745 --- /dev/null +++ b/apps/prs/web/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@nx/js/babel"] +} diff --git a/apps/prs/web/.eslintrc.json b/apps/prs/web/.eslintrc.json new file mode 100644 index 0000000000..3456be9b90 --- /dev/null +++ b/apps/prs/web/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/apps/prs/web/.swcrc b/apps/prs/web/.swcrc new file mode 100644 index 0000000000..a2d5b04f47 --- /dev/null +++ b/apps/prs/web/.swcrc @@ -0,0 +1,8 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript" + }, + "target": "es2016" + } +} diff --git a/apps/prs/web/index.html b/apps/prs/web/index.html new file mode 100644 index 0000000000..34d5db9f03 --- /dev/null +++ b/apps/prs/web/index.html @@ -0,0 +1,21 @@ + + + + + + PlaygroundWeb + + + + + + + + + + +
+ + + + diff --git a/apps/prs/web/project.json b/apps/prs/web/project.json new file mode 100644 index 0000000000..3e590fd061 --- /dev/null +++ b/apps/prs/web/project.json @@ -0,0 +1,68 @@ +{ + "name": "web-prs", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/prs/web/src", + "tags": [], + "implicitDependencies": [ + "web-components" + ], + "targets": { + "build": { + "executor": "@nx/vite:build", + "outputs": [ + "{options.outputPath}" + ], + "defaultConfiguration": "production", + "options": { + "outputPath": "dist/apps/prs/web" + }, + "configurations": { + "development": { + "mode": "development" + }, + "production": { + "mode": "production" + } + } + }, + "serve": { + "executor": "@nx/vite:dev-server", + "defaultConfiguration": "development", + "options": { + "buildTarget": "web-prs:build" + }, + "configurations": { + "development": { + "buildTarget": "web-prs:build:development", + "hmr": true + }, + "production": { + "buildTarget": "web-prs:build:production", + "hmr": false + } + } + }, + "preview": { + "executor": "@nx/vite:preview-server", + "defaultConfiguration": "development", + "options": { + "buildTarget": "web-prs:build" + }, + "configurations": { + "development": { + "buildTarget": "web-prs:build:development" + }, + "production": { + "buildTarget": "web-prs:build:production" + } + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": [ + "{options.outputFile}" + ] + } + } +} diff --git a/apps/prs/web/public/favicon.ico b/apps/prs/web/public/favicon.ico new file mode 100644 index 0000000000..317ebcb233 Binary files /dev/null and b/apps/prs/web/public/favicon.ico differ diff --git a/apps/prs/web/src/app/App.svelte b/apps/prs/web/src/app/App.svelte new file mode 100644 index 0000000000..4f92261645 --- /dev/null +++ b/apps/prs/web/src/app/App.svelte @@ -0,0 +1,13 @@ + + Goab Component Playground + + + + + + + diff --git a/apps/prs/web/src/assets/.gitkeep b/apps/prs/web/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/prs/web/src/main.js b/apps/prs/web/src/main.js new file mode 100644 index 0000000000..38af7076f3 --- /dev/null +++ b/apps/prs/web/src/main.js @@ -0,0 +1,11 @@ +import "@abgov/web-components"; +import App from "./app/App.svelte"; + +let app; +const target = document.getElementById("app"); +if (target) { + app = new App({ target }); +} else { + console.error("Target element not found"); +} +export default app; diff --git a/apps/prs/web/src/routes/2333.svelte b/apps/prs/web/src/routes/2333.svelte new file mode 100644 index 0000000000..10806a83e0 --- /dev/null +++ b/apps/prs/web/src/routes/2333.svelte @@ -0,0 +1,19 @@ + + +
+

Route 2333

+

This is the content for the /2333 route.

+
+ + diff --git a/apps/prs/web/src/styles.css b/apps/prs/web/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/apps/prs/web/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/apps/prs/web/src/svelte-shim.d.ts b/apps/prs/web/src/svelte-shim.d.ts new file mode 100644 index 0000000000..393ff5ef70 --- /dev/null +++ b/apps/prs/web/src/svelte-shim.d.ts @@ -0,0 +1,5 @@ +declare module '*.svelte' { + import type { ComponentType } from 'svelte'; + const component: ComponentType; + export default component; +} diff --git a/apps/prs/web/svelte.config.mjs b/apps/prs/web/svelte.config.mjs new file mode 100644 index 0000000000..3bce8eaa6c --- /dev/null +++ b/apps/prs/web/svelte.config.mjs @@ -0,0 +1,7 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +}; diff --git a/apps/prs/web/tsconfig.app.json b/apps/prs/web/tsconfig.app.json new file mode 100644 index 0000000000..5a6d3e61df --- /dev/null +++ b/apps/prs/web/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts", "src/**/*.svelte"], + "exclude": ["vite.config.mts", "svelte.config.mjs", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/apps/prs/web/tsconfig.json b/apps/prs/web/tsconfig.json new file mode 100644 index 0000000000..715e5cd65f --- /dev/null +++ b/apps/prs/web/tsconfig.json @@ -0,0 +1,27 @@ +{ + "extends": "../../../tsconfig.base.json", + "files": [], + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true, + "types": ["vite/client"] + }, + "include": ["src"], + "references": [ + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/apps/prs/web/vite.config.mts b/apps/prs/web/vite.config.mts new file mode 100644 index 0000000000..8d35eda1ad --- /dev/null +++ b/apps/prs/web/vite.config.mts @@ -0,0 +1,38 @@ +/// +import { defineConfig } from "vite"; +import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; + +export default defineConfig({ + root: __dirname, + cacheDir: "../../node_modules/.vite/apps/prs-web", + + server: { + port: 4202, + host: "0.0.0.0", + // Enable SPA fallback for client-side routing + historyApiFallback: true, + }, + + preview: { + port: 4300, + host: "localhost", + // Enable SPA fallback in preview mode too + historyApiFallback: true, + }, + + plugins: [nxViteTsPaths(), svelte()], + + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + + build: { + outDir: "../../dist/apps/prs-web", + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + }, +}); diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..6915301551 --- /dev/null +++ b/flake.lock @@ -0,0 +1,126 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1761672384, + "narHash": "sha256-o9KF3DJL7g7iYMZq9SWgfS1BFlNbsm6xplRjVlOCkXI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "08dacfca559e1d7da38f3cf05f1f45ee9bfd213c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 0, + "narHash": "sha256-u+rxA79a0lyhG+u+oPBRtTDtzz8kvkc9a6SWSt9ekVc=", + "path": "/nix/store/0283cbhm47kd3lr9zmc5fvdrx9qkav8s-source", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "playwright": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1760833992, + "narHash": "sha256-CiVBf+Com8mwDexMVw6s4BIT1J1In/UNHvaqiZwSfIs=", + "owner": "pietdevries94", + "repo": "playwright-web-flake", + "rev": "d3996ee82c6bcdc4c9535b94068abaa2744a7411", + "type": "github" + }, + "original": { + "owner": "pietdevries94", + "repo": "playwright-web-flake", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "playwright": "playwright" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..237d94a0bd --- /dev/null +++ b/flake.nix @@ -0,0 +1,34 @@ +{ + description = "GoA ui-component dev environment"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + inputs.playwright.url = "github:pietdevries94/playwright-web-flake"; + + outputs = { self, flake-utils, nixpkgs, playwright }: + flake-utils.lib.eachDefaultSystem (system: + let + overlay = final: prev: { + inherit (playwright.packages.${system}) playwright-test playwright-driver; + }; + pkgs = import nixpkgs { + inherit system; + overlays = [ overlay ]; + }; + in + { + devShells = { + default = pkgs.mkShell { + buildInputs = [ pkgs.bashInteractive ]; + packages = [ + pkgs.nodejs_24 + pkgs.playwright-test + ]; + shellHook = '' + export SHELL=/run/current-system/sw/bin/bash + export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 + export PLAYWRIGHT_BROWSERS_PATH="${pkgs.playwright-driver.browsers}" + ''; + }; + }; + }); +} diff --git a/libs/angular-components/package-lock.json b/libs/angular-components/package-lock.json index 8c7e68b1ae..81c6de9ffe 100644 --- a/libs/angular-components/package-lock.json +++ b/libs/angular-components/package-lock.json @@ -9,106 +9,11 @@ "version": "0.0.1", "license": "Apache-2.0", "peerDependencies": { - "@angular/core": "18.0.3", - "@angular/forms": "18.0.3" + "@abgov/ui-components-common": "^0.0.0 || ^1.0.0", + "@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@angular/forms": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0" } - }, - "node_modules/@angular/common": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.3.tgz", - "integrity": "sha512-lmT9QbWHduqzpsB0osQFHeSwvQB1iUeNwTVUyMtcs6i46l4qOPtAt2/9DvHUWEUp01EBDxyi385ZI3vD+FHH/w==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.0.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/core": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.3.tgz", - "integrity": "sha512-376hijhEqNpeA+qKncpVTIaZXRdBT6RctEBnFhJ2l57aHPH5S3oaSBQu1k3TEi07FlKOD4XF1+NzX9dvdup1eg==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.14.0" - } - }, - "node_modules/@angular/forms": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.3.tgz", - "integrity": "sha512-+CjDiooUi5FkTP3YQmdO8YRbjZicgLGZonvCdz3mSucLrTY6w3oBocNs6+Kc7fLuO1NKSkFmAfYApBwK3fKBMg==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/core": "18.0.3", - "@angular/platform-browser": "18.0.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.3.tgz", - "integrity": "sha512-1fl/oJOca8BLxLxN0EjwxQZ3xzn3PCCN96ytM54bjdEMiELz+0AcQe5GNKcVjXlwMkibRLl1BP5GIdvnQYqJRA==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "18.0.3", - "@angular/common": "18.0.3", - "@angular/core": "18.0.3" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "peer": true - }, - "node_modules/zone.js": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.6.tgz", - "integrity": "sha512-vyRNFqofdaHVdWAy7v3Bzmn84a1JHWSjpuTZROT/uYn8I3p2cmo7Ro9twFmYRQDPhiYOV7QLk0hhY4JJQVqS6Q==", - "peer": true } } } diff --git a/libs/angular-components/project.json b/libs/angular-components/project.json index 1a00f1d47e..bdb7423f20 100644 --- a/libs/angular-components/project.json +++ b/libs/angular-components/project.json @@ -3,18 +3,13 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "libs/angular-components/src", "prefix": "abgov", - "tags": [], - "implicitDependencies": [ - "web-components", - "common" - ], "projectType": "library", + "tags": [], + "implicitDependencies": ["web-components", "common"], "targets": { "build": { "executor": "@nx/angular:package", - "outputs": [ - "{workspaceRoot}/dist/{projectRoot}" - ], + "outputs": ["{workspaceRoot}/dist/{projectRoot}"], "options": { "project": "libs/angular-components/ng-package.json" }, @@ -30,18 +25,14 @@ }, "test": { "executor": "@nx/jest:jest", - "outputs": [ - "{workspaceRoot}/coverage/{projectRoot}" - ], + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { "jestConfig": "libs/angular-components/jest.config.ts" } }, "lint": { "executor": "@nx/eslint:lint", - "outputs": [ - "{options.outputFile}" - ] + "outputs": ["{options.outputFile}"] }, "release": { "executor": "nx:run-commands", diff --git a/libs/angular-components/src/experimental/index.ts b/libs/angular-components/src/experimental/index.ts new file mode 100644 index 0000000000..190dd9d443 --- /dev/null +++ b/libs/angular-components/src/experimental/index.ts @@ -0,0 +1,2 @@ +export * from "./work-side-menu/work-side-menu"; +export * from "./work-side-menu-item/work-side-menu-item"; diff --git a/libs/angular-components/src/experimental/work-side-menu-item/work-side-menu-item.spec.ts b/libs/angular-components/src/experimental/work-side-menu-item/work-side-menu-item.spec.ts new file mode 100644 index 0000000000..84292ec945 --- /dev/null +++ b/libs/angular-components/src/experimental/work-side-menu-item/work-side-menu-item.spec.ts @@ -0,0 +1,64 @@ +import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { GoabxWorkSideMenuItem } from "./work-side-menu-item"; +import { Component } from "@angular/core"; +import { By } from "@angular/platform-browser"; + +@Component({ + standalone: true, + imports: [GoabxWorkSideMenuItem], + template: ` + + + `, +}) +class TestWorkSideMenuItemComponent { + label = "Test label"; + url = "/test"; + badge = "Test badge"; + current = true; + divider = true; + icon = "triangle"; + testId = "test-id"; + type = "normal"; +} + +describe("GoabxWorkSideMenuItem", () => { + let fixture: ComponentFixture; + let component: TestWorkSideMenuItemComponent; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [TestWorkSideMenuItemComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(TestWorkSideMenuItemComponent); + component = fixture.componentInstance; + + fixture.detectChanges(); + tick(); // Wait for setTimeout in ngOnInit + fixture.detectChanges(); + })); + + it("should render and set the props correctly", () => { + const menuItemElement = fixture.debugElement.query( + By.css("goa-work-side-menu-item"), + ).nativeElement; + expect(menuItemElement.getAttribute("label")).toBe("Test label"); + expect(menuItemElement.getAttribute("url")).toBe("/test"); + expect(menuItemElement.getAttribute("badge")).toBe("Test badge"); + expect(menuItemElement.getAttribute("current")).toBe("true"); + expect(menuItemElement.getAttribute("divider")).toBe("true"); + expect(menuItemElement.getAttribute("icon")).toBe("triangle"); + expect(menuItemElement.getAttribute("testid")).toBe("test-id"); + expect(menuItemElement.getAttribute("type")).toBe("normal"); + }); +}); diff --git a/libs/angular-components/src/experimental/work-side-menu-item/work-side-menu-item.ts b/libs/angular-components/src/experimental/work-side-menu-item/work-side-menu-item.ts new file mode 100644 index 0000000000..bc302ea885 --- /dev/null +++ b/libs/angular-components/src/experimental/work-side-menu-item/work-side-menu-item.ts @@ -0,0 +1,54 @@ +import { GoabWorkSideMenuItemType } from "@abgov/ui-components-common"; +import { + CUSTOM_ELEMENTS_SCHEMA, + Component, + Input, + OnInit, + ChangeDetectorRef, +} from "@angular/core"; +import { CommonModule } from "@angular/common"; + +@Component({ + standalone: true, + selector: "goabx-work-side-menu-item", // eslint-disable-line + imports: [CommonModule], + template: ` + + + + `, + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class GoabxWorkSideMenuItem implements OnInit { + @Input({ required: true }) label!: string; + @Input({ required: true }) url!: string; + @Input() badge?: string; + @Input() current?: boolean; + @Input() divider?: boolean; + @Input() icon?: string; + @Input() testId?: string; + @Input() type?: GoabWorkSideMenuItemType = "normal"; + + isReady = false; + + constructor(private cdr: ChangeDetectorRef) {} + + ngOnInit(): void { + // For Angular 20, we need to delay rendering the web component + // to ensure all attributes are properly bound before the component initializes + setTimeout(() => { + this.isReady = true; + this.cdr.detectChanges(); + }, 0); + } +} diff --git a/libs/angular-components/src/experimental/work-side-menu/work-side-menu.spec.ts b/libs/angular-components/src/experimental/work-side-menu/work-side-menu.spec.ts new file mode 100644 index 0000000000..0812d38ece --- /dev/null +++ b/libs/angular-components/src/experimental/work-side-menu/work-side-menu.spec.ts @@ -0,0 +1,67 @@ +import { ComponentFixture, TestBed, tick, fakeAsync } from "@angular/core/testing"; +import { GoabxWorkSideMenu } from "./work-side-menu"; +import { Component } from "@angular/core"; +import { By } from "@angular/platform-browser"; + +@Component({ + standalone: true, + imports: [GoabxWorkSideMenu], + template: ` + + + +
Primary content
+
+ +
Secondary content
+
+ +
Account content
+
+ `, +}) +class TestWorkSideMenuComponent { + open = true; + heading = "Test heading"; + url = "/test"; + userName = "Test User"; + userSecondaryText = "test@example.com"; + testId = "test-id"; +} +describe("GoabxBWorkSideMenu", () => { + let fixture: ComponentFixture; + let component: TestWorkSideMenuComponent; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [TestWorkSideMenuComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(TestWorkSideMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + tick(); // Wait for setTimeout in ngOnInit + fixture.detectChanges(); + })); + + it("should render and set the props correctly", () => { + const menuElement = fixture.debugElement.query( + By.css("goa-work-side-menu"), + ).nativeElement; + expect(menuElement.getAttribute("heading")).toBe("Test heading"); + expect(menuElement.getAttribute("url")).toBe("/test"); + expect(menuElement.getAttribute("user-name")).toBe("Test User"); + expect(menuElement.getAttribute("user-secondary-text")).toBe("test@example.com"); + expect(menuElement.getAttribute("testId")).toBe("test-id"); + }); +}); diff --git a/libs/angular-components/src/experimental/work-side-menu/work-side-menu.ts b/libs/angular-components/src/experimental/work-side-menu/work-side-menu.ts new file mode 100644 index 0000000000..1cacbedc59 --- /dev/null +++ b/libs/angular-components/src/experimental/work-side-menu/work-side-menu.ts @@ -0,0 +1,69 @@ +import { + booleanAttribute, + CUSTOM_ELEMENTS_SCHEMA, + Component, + Input, + Output, + TemplateRef, + EventEmitter, + OnInit, + ChangeDetectorRef, +} from "@angular/core"; +import { CommonModule, NgTemplateOutlet } from "@angular/common"; +@Component({ + standalone: true, + selector: "goabx-work-side-menu", // eslint-disable-line + imports: [NgTemplateOutlet, CommonModule], + template: ` + +
+ +
+
+ +
+
+ +
+
+ `, + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class GoabxWorkSideMenu implements OnInit { + @Input({ required: true }) heading!: string; + @Input({ required: true }) url!: string; + @Input() userName?: string; + @Input() userSecondaryText?: string; + @Input({ transform: booleanAttribute }) open?: boolean; + @Input() testId?: string; + @Input() primaryContent!: TemplateRef; + @Input() secondaryContent!: TemplateRef; + @Input() accountContent!: TemplateRef; + @Output() onToggle = new EventEmitter(); + + isReady = false; + + constructor(private cdr: ChangeDetectorRef) {} + + ngOnInit(): void { + // For Angular 20, we need to delay rendering the web component + // to ensure all attributes are properly bound before the component initializes + setTimeout(() => { + this.isReady = true; + this.cdr.detectChanges(); + }, 0); + } + + _onToggle() { + this.onToggle.emit(); + } +} diff --git a/libs/angular-components/src/index.ts b/libs/angular-components/src/index.ts index 55aebfe4b6..ddf40f76ec 100644 --- a/libs/angular-components/src/index.ts +++ b/libs/angular-components/src/index.ts @@ -1,3 +1,4 @@ export * from "./lib/angular-components.module"; export * from "./lib/components"; +export * from "./experimental"; export * from "@abgov/ui-components-common"; diff --git a/libs/angular-components/src/lib/components/badge/badge.spec.ts b/libs/angular-components/src/lib/components/badge/badge.spec.ts index cfaa3e1fc2..9862bbaa19 100644 --- a/libs/angular-components/src/lib/components/badge/badge.spec.ts +++ b/libs/angular-components/src/lib/components/badge/badge.spec.ts @@ -33,16 +33,28 @@ class TestBadgeComponent { mr?: Spacing; } +@Component({ + standalone: true, + imports: [GoabBadge], + template: ` `, +}) +class TestBadgeNoIconComponent { + type?: GoabBadgeType; + content?: string; +} + describe("GoABBadge", () => { let fixture: ComponentFixture; let component: TestBadgeComponent; beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [GoabBadge, TestBadgeComponent], + imports: [GoabBadge, TestBadgeComponent, TestBadgeNoIconComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); + })); + it("should render and set the props correctly", fakeAsync(() => { fixture = TestBed.createComponent(TestBadgeComponent); component = fixture.componentInstance; component.type = "information"; @@ -58,9 +70,6 @@ describe("GoABBadge", () => { fixture.detectChanges(); tick(); fixture.detectChanges(); - })); - - it("should render and set the props correctly", () => { const badgeElement = fixture.debugElement.query(By.css("goa-badge")).nativeElement; expect(badgeElement.getAttribute("type")).toBe("information"); expect(badgeElement.getAttribute("content")).toBe("Information"); @@ -71,5 +80,32 @@ describe("GoABBadge", () => { expect(badgeElement.getAttribute("mb")).toBe(component.mb); expect(badgeElement.getAttribute("ml")).toBe(component.ml); expect(badgeElement.getAttribute("mr")).toBe(component.mr); - }); + })); + + it("should not set icon attribute by default (icon undefined)", fakeAsync(() => { + const noIconFixture = TestBed.createComponent(TestBadgeNoIconComponent); + const noIconComponent = noIconFixture.componentInstance; + noIconComponent.type = "information"; + noIconComponent.content = "Information"; + noIconFixture.detectChanges(); + tick(); + noIconFixture.detectChanges(); + const badgeElement = noIconFixture.debugElement.query( + By.css("goa-badge"), + ).nativeElement; + expect(badgeElement.getAttribute("icon")).toBe("false"); + })); + + it("should not render icon when icon is false", fakeAsync(() => { + fixture = TestBed.createComponent(TestBadgeComponent); + component = fixture.componentInstance; + component.type = "information"; + component.content = "Information"; + component.icon = false; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + const badgeElement = fixture.debugElement.query(By.css("goa-badge")).nativeElement; + expect(badgeElement.getAttribute("icon")).toBe("false"); + })); }); diff --git a/libs/angular-components/src/lib/components/badge/badge.ts b/libs/angular-components/src/lib/components/badge/badge.ts index b3aaf8e1cb..b52bbb3e4a 100644 --- a/libs/angular-components/src/lib/components/badge/badge.ts +++ b/libs/angular-components/src/lib/components/badge/badge.ts @@ -17,7 +17,7 @@ import { GoabBaseComponent } from "../base.component"; ` + * }) + * export class GoabInput extends GoabControlValueAccessor { + * constructor(private cdr: ChangeDetectorRef, renderer: Renderer2) { + * super(renderer); // Required: pass Renderer2 to base class + * } + * } + * ``` * * ## Properties * - `id?`: An optional identifier for the component. @@ -40,10 +63,11 @@ export abstract class GoabBaseComponent { * * ## Methods * - `markAsTouched()`: Marks the component as touched and triggers the `fcTouched` callback if defined. - * - `writeValue(value: unknown)`: Writes a new value to the form control. + * - `writeValue(value: unknown)`: Writes a new value to the form control (can be overridden for special behavior like checkbox). * - `registerOnChange(fn: any)`: Registers a function to handle changes in the form control value. * - `registerOnTouched(fn: any)`: Registers a function to handle touch events on the form control. * - `setDisabledState?(isDisabled: boolean)`: Sets the disabled state of the component. + * - `convertValueToString(value: unknown)`: Converts a value to a string for DOM attribute assignment (can be overridden). * * ## Callbacks * - `fcChange?`: A function to handle changes in the form control value. @@ -87,12 +111,42 @@ export abstract class GoabControlValueAccessor } } + /** + * Reference to the native GOA web component element. + * Child templates should declare `#goaComponentRef` on the `goa-*` element. + * The base class captures it here so children don't need their own ViewChild. + */ + @ViewChild("goaComponentRef", { static: false, read: ElementRef }) + protected goaComponentRef?: ElementRef; + + constructor(protected renderer: Renderer2) { + super(); + } + + /** + * Convert an arbitrary value into a string for DOM attribute assignment. + * Child classes can override when they need special formatting. + * @param value The value to convert + * @returns string representation or empty string for nullish/empty + */ + protected convertValueToString(value: unknown): string { + if (value === null || value === undefined || value === "") { + return ""; + } + return String(value); + } + /** * Writes a new value to the form control. * @param {unknown} value - The value to write. */ public writeValue(value: unknown): void { this.value = value; + const el = this.goaComponentRef?.nativeElement as HTMLElement | undefined; + if (el) { + const stringValue = this.convertValueToString(value); + this.renderer.setAttribute(el, "value", stringValue); + } } /** diff --git a/libs/angular-components/src/lib/components/block/block.ts b/libs/angular-components/src/lib/components/block/block.ts index f5d903d63f..51823fd1b6 100644 --- a/libs/angular-components/src/lib/components/block/block.ts +++ b/libs/angular-components/src/lib/components/block/block.ts @@ -23,6 +23,9 @@ import { GoabBaseComponent } from "../base.component"; [attr.gap]="gap" [attr.direction]="direction" [attr.alignment]="alignment" + [attr.width]="width" + [attr.min-width]="minWidth" + [attr.max-width]="maxWidth" [attr.testid]="testId" [attr.mt]="mt" [attr.mb]="mb" @@ -38,6 +41,9 @@ export class GoabBlock extends GoabBaseComponent implements OnInit { @Input() gap?: Spacing; @Input() direction?: GoabBlockDirection; @Input() alignment?: GoabBlockAlignment; + @Input() width?: string; + @Input() minWidth?: string; + @Input() maxWidth?: string; isReady = false; diff --git a/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.spec.ts b/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.spec.ts index 5d07b0a673..dcc6d7c82d 100644 --- a/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.spec.ts +++ b/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.spec.ts @@ -124,9 +124,11 @@ describe("GoabCheckboxList", () => { By.css("goa-checkbox-list"), ).nativeElement; + const changeEvent = new Event("change"); const detail: GoabCheckboxListOnChangeDetail = { name: "fruits", value: ["apple", "banana"], + event: changeEvent, }; fireEvent( @@ -205,22 +207,30 @@ describe("GoabCheckboxList", () => { ).nativeElement; // First change + const changeEvent1 = new Event("change"); const detail1: GoabCheckboxListOnChangeDetail = { name: "fruits", value: ["apple"], + event: changeEvent1, }; fireEvent(el, new CustomEvent("_change", { detail: detail1 })); - expect(onChangeSpy).toHaveBeenCalledWith(detail1); + expect(onChangeSpy).toHaveBeenCalledWith( + expect.objectContaining({ ...detail1, event: expect.any(Event) }), + ); // Second change + const changeEvent2 = new Event("change"); const detail2: GoabCheckboxListOnChangeDetail = { name: "fruits", value: ["apple", "banana"], + event: changeEvent2, }; fireEvent(el, new CustomEvent("_change", { detail: detail2 })); - expect(onChangeSpy).toHaveBeenCalledWith(detail2); + expect(onChangeSpy).toHaveBeenCalledWith( + expect.objectContaining({ ...detail2, event: expect.any(Event) }), + ); expect(onChangeSpy).toHaveBeenCalledTimes(2); }); }); diff --git a/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.ts b/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.ts index db052a4dbe..b9b2dc1fad 100644 --- a/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.ts +++ b/libs/angular-components/src/lib/components/checkbox-list/checkbox-list.ts @@ -8,6 +8,7 @@ import { forwardRef, OnInit, ChangeDetectorRef, + Renderer2, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { CommonModule } from "@angular/common"; @@ -51,8 +52,11 @@ export class GoabCheckboxList extends GoabControlValueAccessor implements OnInit // Override value to handle string arrays consistently @Input() override value?: string[]; - constructor(private cdr: ChangeDetectorRef) { - super(); + constructor( + private cdr: ChangeDetectorRef, + renderer: Renderer2, + ) { + super(renderer); } ngOnInit(): void { @@ -66,7 +70,7 @@ export class GoabCheckboxList extends GoabControlValueAccessor implements OnInit _onChange(e: Event) { try { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onChange.emit(detail); this.markAsTouched(); diff --git a/libs/angular-components/src/lib/components/checkbox/checkbox.spec.ts b/libs/angular-components/src/lib/components/checkbox/checkbox.spec.ts index fc7d6a82e0..35e21f225c 100644 --- a/libs/angular-components/src/lib/components/checkbox/checkbox.spec.ts +++ b/libs/angular-components/src/lib/components/checkbox/checkbox.spec.ts @@ -93,7 +93,7 @@ describe("GoabCheckbox", () => { expect(checkboxElement.getAttribute("maxwidth")).toBe("480px"); }); - it("should handle onChange event", fakeAsync(() => { + it("should handle onChange event", async () => { const onChange = jest.spyOn(component, "onChange"); const checkboxElement = fixture.debugElement.query( @@ -108,7 +108,50 @@ describe("GoabCheckbox", () => { ); expect(onChange).toHaveBeenCalled(); - })); + }); + + describe("writeValue", () => { + it("should set checked attribute to true when value is truthy", () => { + const checkboxComponent = fixture.debugElement.query(By.css("goab-checkbox")).componentInstance; + const checkboxElement = fixture.debugElement.query(By.css("goa-checkbox")).nativeElement; + + checkboxComponent.writeValue(true); + expect(checkboxElement.getAttribute("checked")).toBe("true"); + + checkboxComponent.writeValue("some value"); + expect(checkboxElement.getAttribute("checked")).toBe("true"); + + checkboxComponent.writeValue(1); + expect(checkboxElement.getAttribute("checked")).toBe("true"); + }); + + it("should set checked attribute to false when value is falsy", () => { + const checkboxComponent = fixture.debugElement.query(By.css("goab-checkbox")).componentInstance; + const checkboxElement = fixture.debugElement.query(By.css("goa-checkbox")).nativeElement; + + checkboxComponent.writeValue(false); + expect(checkboxElement.getAttribute("checked")).toBe("false"); + + checkboxComponent.writeValue(null); + expect(checkboxElement.getAttribute("checked")).toBe("false"); + + checkboxComponent.writeValue(undefined); + expect(checkboxElement.getAttribute("checked")).toBe("false"); + + checkboxComponent.writeValue(""); + expect(checkboxElement.getAttribute("checked")).toBe("false"); + }); + + it("should update component value property", () => { + const checkboxComponent = fixture.debugElement.query(By.css("goab-checkbox")).componentInstance; + + checkboxComponent.writeValue(true); + expect(checkboxComponent.value).toBe(true); + + checkboxComponent.writeValue(null); + expect(checkboxComponent.value).toBe(null); + }); + }); }); @Component({ @@ -136,7 +179,7 @@ describe("Checkbox with description slot", () => { it("should render with slot description", fakeAsync(() => { TestBed.configureTestingModule({ - imports: [GoabCheckbox, ReactiveFormsModule, TestCheckboxWithDescriptionSlotComponent], + imports: [TestCheckboxWithDescriptionSlotComponent, GoabCheckbox, ReactiveFormsModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); @@ -155,7 +198,7 @@ describe("Checkbox with description slot", () => { @Component({ standalone: true, - imports: [GoabCheckbox, ReactiveFormsModule], + imports: [GoabCheckbox], template: ` { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [GoabCheckbox, ReactiveFormsModule, TestCheckboxWithRevealSlotComponent], + imports: [TestCheckboxWithRevealSlotComponent, GoabCheckbox, ReactiveFormsModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); diff --git a/libs/angular-components/src/lib/components/checkbox/checkbox.ts b/libs/angular-components/src/lib/components/checkbox/checkbox.ts index 47dcd083fd..b7e42ca624 100644 --- a/libs/angular-components/src/lib/components/checkbox/checkbox.ts +++ b/libs/angular-components/src/lib/components/checkbox/checkbox.ts @@ -10,6 +10,7 @@ import { booleanAttribute, OnInit, ChangeDetectorRef, + Renderer2, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { NgTemplateOutlet, CommonModule } from "@angular/common"; @@ -19,34 +20,35 @@ import { GoabControlValueAccessor } from "../base.component"; standalone: true, selector: "goab-checkbox", template: ` - -
- -
-
- -
-
`, + #goaComponentRef + *ngIf="isReady" + [attr.name]="name" + [checked]="checked" + [disabled]="disabled" + [attr.indeterminate]="indeterminate ? 'true' : undefined" + [attr.error]="error" + [attr.text]="text" + [value]="value" + [attr.testid]="testId" + [attr.arialabel]="ariaLabel" + [attr.description]="getDescriptionAsString()" + [attr.revealarialabel]="revealArialLabel" + [id]="id" + [attr.maxwidth]="maxWidth" + [attr.mt]="mt" + [attr.mb]="mb" + [attr.ml]="ml" + [attr.mr]="mr" + (_change)="_onChange($event)" + > + +
+ +
+
+ +
+ `, schemas: [CUSTOM_ELEMENTS_SCHEMA], providers: [ { @@ -60,8 +62,11 @@ import { GoabControlValueAccessor } from "../base.component"; export class GoabCheckbox extends GoabControlValueAccessor implements OnInit { isReady = false; - constructor(private cdr: ChangeDetectorRef) { - super(); + constructor( + private cdr: ChangeDetectorRef, + renderer: Renderer2, + ) { + super(renderer); } ngOnInit(): void { @@ -78,7 +83,7 @@ export class GoabCheckbox extends GoabControlValueAccessor implements OnInit { @Input({ transform: booleanAttribute }) indeterminate?: boolean; @Input() text?: string; // ** NOTE: can we just use the base component for this? - @Input() override value?: string | number | boolean; + @Input() override value?: string | number | boolean | null; @Input() ariaLabel?: string; @Input() description!: string | TemplateRef; @Input() reveal?: TemplateRef; @@ -99,9 +104,20 @@ export class GoabCheckbox extends GoabControlValueAccessor implements OnInit { } _onChange(e: Event) { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onChange.emit(detail); this.markAsTouched(); this.fcChange?.(detail.binding === "check" ? detail.checked : detail.value || ""); } + + // Checkbox is a special case: it uses `checked` instead of `value`. + override writeValue(value: string | number | boolean | null): void { + this.value = value; + this.checked = !!value; + + const el = this.goaComponentRef?.nativeElement as HTMLElement | undefined; + if (el) { + this.renderer.setAttribute(el, "checked", this.checked ? "true" : "false"); + } + } } diff --git a/libs/angular-components/src/lib/components/container/container.spec.ts b/libs/angular-components/src/lib/components/container/container.spec.ts index e09494b22f..8d4502187e 100644 --- a/libs/angular-components/src/lib/components/container/container.spec.ts +++ b/libs/angular-components/src/lib/components/container/container.spec.ts @@ -5,7 +5,8 @@ import { GoabContainerAccent, GoabContainerPadding, GoabContainerType, - GoabContainerWidth, Spacing, + GoabContainerWidth, + Spacing, } from "@abgov/ui-components-common"; import { GoabButton } from "../button/button"; import { By } from "@angular/platform-browser"; @@ -14,28 +15,32 @@ import { By } from "@angular/platform-browser"; standalone: true, imports: [GoabContainer, GoabButton], template: ` - - - Save - - -
This is a title
-
+ + + Save + + +
This is a title
+
- Container content -
- ` + Container content +
+ `, }) class TestContainerComponent { type?: GoabContainerType = "interactive"; @@ -47,6 +52,9 @@ class TestContainerComponent { mb?: Spacing; ml?: Spacing; mr?: Spacing; + maxWidth?: string; + minHeight?: string; + maxHeight?: string; onClick() { /* do nothing */ @@ -60,7 +68,7 @@ describe("GoABContainer", () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ imports: [GoabButton, GoabContainer, TestContainerComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); fixture = TestBed.createComponent(TestContainerComponent); @@ -75,6 +83,9 @@ describe("GoABContainer", () => { component.mb = "l"; component.ml = "xl"; component.width = "content"; + component.maxWidth = "480px"; + component.minHeight = "120px"; + component.maxHeight = "240px"; fixture.detectChanges(); tick(); @@ -85,19 +96,23 @@ describe("GoABContainer", () => { const el = fixture.debugElement.query(By.css("goa-container")).nativeElement; expect(el).toBeTruthy(); - expect(el?.getAttribute("type")).toBe(component.type); - expect(el?.getAttribute("accent")).toBe(component.accent); - expect(el?.getAttribute("padding")).toBe(component.padding); - expect(el?.getAttribute("mt")).toBe(component.mt); - expect(el?.getAttribute("mr")).toBe(component.mr); - expect(el?.getAttribute("mb")).toBe(component.mb); - expect(el?.getAttribute("ml")).toBe(component.ml); - expect(el?.getAttribute("width")).toBe(component.width); - expect(el?.getAttribute("maxwidth")).toBe("480px"); + expect(el?.getAttribute("type")).toBe(component.type); + expect(el?.getAttribute("accent")).toBe(component.accent); + expect(el?.getAttribute("padding")).toBe(component.padding); + expect(el?.getAttribute("mt")).toBe(component.mt); + expect(el?.getAttribute("mr")).toBe(component.mr); + expect(el?.getAttribute("mb")).toBe(component.mb); + expect(el?.getAttribute("ml")).toBe(component.ml); + expect(el?.getAttribute("width")).toBe(component.width); + expect(el?.getAttribute("maxwidth")).toBe(component.maxWidth); + expect(el?.getAttribute("minheight")).toBe(component.minHeight); + expect(el?.getAttribute("maxheight")).toBe(component.maxHeight); - expect(el?.querySelector("[slot='title']")?.innerHTML).toContain("This is a title"); - expect(el?.querySelector("[slot='actions']")?.querySelector("goa-button")).not.toBeFalsy(); + expect(el?.querySelector("[slot='title']")?.innerHTML).toContain("This is a title"); + expect( + el?.querySelector("[slot='actions']")?.querySelector("goa-button"), + ).not.toBeFalsy(); - expect(el?.innerHTML).toContain("Container content"); - }) -}) + expect(el?.innerHTML).toContain("Container content"); + }); +}); diff --git a/libs/angular-components/src/lib/components/container/container.ts b/libs/angular-components/src/lib/components/container/container.ts index fcb48e7b54..ed54c8ddd4 100644 --- a/libs/angular-components/src/lib/components/container/container.ts +++ b/libs/angular-components/src/lib/components/container/container.ts @@ -26,6 +26,8 @@ import { GoabBaseComponent } from "../base.component"; [attr.padding]="padding" [attr.width]="width" [attr.maxwidth]="maxWidth" + [attr.minheight]="minHeight" + [attr.maxheight]="maxHeight" [attr.testid]="testId" [attr.mt]="mt" [attr.mb]="mb" @@ -48,6 +50,8 @@ export class GoabContainer extends GoabBaseComponent implements OnInit { @Input() padding?: GoabContainerPadding = "relaxed"; @Input() width?: GoabContainerWidth = "full"; @Input() maxWidth?: string; + @Input() minHeight?: string; + @Input() maxHeight?: string; @Input() title!: TemplateRef; @Input() actions!: TemplateRef; diff --git a/libs/angular-components/src/lib/components/data-grid/data-grid.spec.ts b/libs/angular-components/src/lib/components/data-grid/data-grid.spec.ts new file mode 100644 index 0000000000..8cad59b3e5 --- /dev/null +++ b/libs/angular-components/src/lib/components/data-grid/data-grid.spec.ts @@ -0,0 +1,95 @@ +import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { GoabDataGrid } from "./data-grid"; +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { By } from "@angular/platform-browser"; + +@Component({ + standalone: true, + imports: [GoabDataGrid], + template: ` + +
Test content
+
+ ` +}) +class TestDataGridComponent { + keyboardIconVisibility: "visible" | "hidden" = "visible"; + keyboardIconPosition: "left" | "right" = "left"; + keyboardNav: "layout" | "table" = "table"; +} + +describe("GoabDataGrid", () => { + let fixture: ComponentFixture; + let component: TestDataGridComponent; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [GoabDataGrid, TestDataGridComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(TestDataGridComponent); + component = fixture.componentInstance; + }); + + it("should create component and render goa-data-grid with projected content", fakeAsync(() => { + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + expect(component).toBeTruthy(); + + const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement; + expect(dataGridElement).toBeTruthy(); + expect(dataGridElement.textContent).toContain("Test content"); + expect(dataGridElement.getAttribute("keyboard-icon-visibility")).toBe("visible"); + expect(dataGridElement.getAttribute("keyboard-icon-position")).toBe("left"); + })); + + it("should hide keyboard icon when keyboardIconVisibility is hidden", fakeAsync(() => { + component.keyboardIconVisibility = "hidden"; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement; + expect(dataGridElement).toBeTruthy(); + expect(dataGridElement.getAttribute("keyboard-icon-visibility")).toBe("hidden"); + })); + + it("should set keyboard icon position to right", fakeAsync(() => { + component.keyboardIconPosition = "right"; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement; + expect(dataGridElement).toBeTruthy(); + expect(dataGridElement.getAttribute("keyboard-icon-position")).toBe("right"); + })); + + it("should set keyboardNav to table mode", fakeAsync(() => { + component.keyboardNav = "table"; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement; + expect(dataGridElement).toBeTruthy(); + expect(dataGridElement.getAttribute("keyboard-nav")).toBe("table"); + })); + + it("should set keyboardNav to layout mode", fakeAsync(() => { + component.keyboardNav = "layout"; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement; + expect(dataGridElement).toBeTruthy(); + expect(dataGridElement.getAttribute("keyboard-nav")).toBe("layout"); + })); +}); diff --git a/libs/angular-components/src/lib/components/data-grid/data-grid.ts b/libs/angular-components/src/lib/components/data-grid/data-grid.ts new file mode 100644 index 0000000000..00f391a133 --- /dev/null +++ b/libs/angular-components/src/lib/components/data-grid/data-grid.ts @@ -0,0 +1,37 @@ +import { CUSTOM_ELEMENTS_SCHEMA, Component, Input, ChangeDetectorRef, OnInit } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +@Component({ + standalone: true, + selector: "goab-data-grid", + imports: [CommonModule], + template: ` + + + + `, + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class GoabDataGrid implements OnInit { + @Input() keyboardIconVisibility: "visible" | "hidden" = "visible"; + @Input() keyboardIconPosition: "left" | "right" = "left"; + @Input({ required: true }) keyboardNav!: "layout" | "table"; + + isReady = false; + + constructor(private cdr: ChangeDetectorRef) {} + + ngOnInit(): void { + // For Angular, we need to delay rendering the web component + // to ensure all attributes are properly bound before the component initializes + setTimeout(() => { + this.isReady = true; + this.cdr.detectChanges(); + }, 0); + } +} diff --git a/libs/angular-components/src/lib/components/date-picker/date-picker.ts b/libs/angular-components/src/lib/components/date-picker/date-picker.ts index dc9872fafa..b31539ca5f 100644 --- a/libs/angular-components/src/lib/components/date-picker/date-picker.ts +++ b/libs/angular-components/src/lib/components/date-picker/date-picker.ts @@ -1,4 +1,7 @@ -import { GoabDatePickerInputType, GoabDatePickerOnChangeDetail } from "@abgov/ui-components-common"; +import { + GoabDatePickerInputType, + GoabDatePickerOnChangeDetail, +} from "@abgov/ui-components-common"; import { CUSTOM_ELEMENTS_SCHEMA, Component, @@ -10,6 +13,7 @@ import { HostListener, OnInit, ChangeDetectorRef, + Renderer2, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { CommonModule } from "@angular/common"; @@ -20,6 +24,7 @@ import { GoabControlValueAccessor } from "../base.component"; selector: "goab-date-picker", imports: [CommonModule], template: ` (); @@ -72,14 +78,18 @@ export class GoabDatePicker extends GoabControlValueAccessor implements OnInit { } _onChange(e: Event) { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onChange.emit(detail); this.markAsTouched(); this.fcChange?.(detail.value); } - constructor(protected elementRef: ElementRef, private cdr: ChangeDetectorRef) { - super(); + constructor( + protected elementRef: ElementRef, + private cdr: ChangeDetectorRef, + renderer: Renderer2, + ) { + super(renderer); } ngOnInit(): void { @@ -89,6 +99,12 @@ export class GoabDatePicker extends GoabControlValueAccessor implements OnInit { this.isReady = true; this.cdr.detectChanges(); }, 0); + + if (this.value && typeof this.value !== "string") { + console.warn( + "Using a `Date` type for value is deprecated. Instead use a string of the format `yyyy-mm-dd`", + ); + } } override setDisabledState(isDisabled: boolean) { @@ -104,13 +120,13 @@ export class GoabDatePicker extends GoabControlValueAccessor implements OnInit { override writeValue(value: Date | null): void { this.value = value; - const datePickerEl = this.elementRef?.nativeElement?.querySelector("goa-date-picker"); - + const datePickerEl = this.goaComponentRef?.nativeElement as HTMLElement | undefined; if (datePickerEl) { if (!value) { - datePickerEl.setAttribute("value", ""); + this.renderer.setAttribute(datePickerEl, "value", ""); } else { - datePickerEl.setAttribute( + this.renderer.setAttribute( + datePickerEl, "value", value instanceof Date ? value.toISOString() : value, ); diff --git a/libs/angular-components/src/lib/components/dropdown/dropdown.spec.ts b/libs/angular-components/src/lib/components/dropdown/dropdown.spec.ts index e47f7edebe..c9e58d824c 100644 --- a/libs/angular-components/src/lib/components/dropdown/dropdown.spec.ts +++ b/libs/angular-components/src/lib/components/dropdown/dropdown.spec.ts @@ -9,7 +9,8 @@ import { fireEvent } from "@testing-library/dom"; @Component({ standalone: true, - imports: [GoabDropdown, GoabDropdownItem, ReactiveFormsModule], + imports: [GoabDropdown, GoabDropdownItem], + schemas: [CUSTOM_ELEMENTS_SCHEMA], template: ` { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [GoabDropdown, GoabDropdownItem, ReactiveFormsModule, TestDropdownComponent], + imports: [TestDropdownComponent, GoabDropdown, GoabDropdownItem, ReactiveFormsModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); @@ -140,6 +141,8 @@ describe("GoABDropdown", () => { const onChangeMock = jest.spyOn(component, "onChange"); component.native = true; fixture.detectChanges(); + tick(); + fixture.detectChanges(); const el = fixture.debugElement.query(By.css("goa-dropdown")).nativeElement; expect(el).toBeTruthy(); @@ -152,4 +155,79 @@ describe("GoABDropdown", () => { ); expect(onChangeMock).toHaveBeenCalled(); })); -}); + + describe("writeValue", () => { + it("should set value attribute when writeValue is called with a value", () => { + const dropdownComponent = fixture.debugElement.query(By.css("goab-dropdown")).componentInstance; + const dropdownElement = fixture.debugElement.query(By.css("goa-dropdown")).nativeElement; + + dropdownComponent.writeValue("red"); + expect(dropdownElement.getAttribute("value")).toBe("red"); + + dropdownComponent.writeValue("blue"); + expect(dropdownElement.getAttribute("value")).toBe("blue"); + }); + + it("should set value attribute to empty string when writeValue is called with null", () => { + const dropdownComponent = fixture.debugElement.query(By.css("goab-dropdown")).componentInstance; + const dropdownElement = fixture.debugElement.query(By.css("goa-dropdown")).nativeElement; + + // First set a value + dropdownComponent.writeValue("red"); + expect(dropdownElement.getAttribute("value")).toBe("red"); + + // Then clear it + dropdownComponent.writeValue(null); + expect(dropdownElement.getAttribute("value")).toBe(""); + }); + + it("should update component value property", () => { + const dropdownComponent = fixture.debugElement.query(By.css("goab-dropdown")).componentInstance; + + dropdownComponent.writeValue("yellow"); + expect(dropdownComponent.value).toBe("yellow"); + + dropdownComponent.writeValue(null); + expect(dropdownComponent.value).toBe(null); + }); + }); + + describe("_onChange", () => { + it("should update component value when user selects an option", () => { + const dropdownComponent = fixture.debugElement.query(By.css("goab-dropdown")).componentInstance; + const dropdownElement = fixture.debugElement.query(By.css("goa-dropdown")).nativeElement; + + fireEvent( + dropdownElement, + new CustomEvent("_change", { + detail: { name: component.name, value: "yellow" }, + }), + ); + + expect(dropdownComponent.value).toBe("yellow"); + }); + + it("should update value to null when cleared", () => { + const dropdownComponent = fixture.debugElement.query(By.css("goab-dropdown")).componentInstance; + const dropdownElement = fixture.debugElement.query(By.css("goa-dropdown")).nativeElement; + + // Set initial value + fireEvent( + dropdownElement, + new CustomEvent("_change", { + detail: { name: component.name, value: "red" }, + }), + ); + expect(dropdownComponent.value).toBe("red"); + + // Clear value + fireEvent( + dropdownElement, + new CustomEvent("_change", { + detail: { name: component.name, value: "" }, + }), + ); + expect(dropdownComponent.value).toBe(null); + }); + }); +}); \ No newline at end of file diff --git a/libs/angular-components/src/lib/components/dropdown/dropdown.ts b/libs/angular-components/src/lib/components/dropdown/dropdown.ts index eb5ab04cca..a2edf0c1de 100644 --- a/libs/angular-components/src/lib/components/dropdown/dropdown.ts +++ b/libs/angular-components/src/lib/components/dropdown/dropdown.ts @@ -9,6 +9,7 @@ import { forwardRef, OnInit, ChangeDetectorRef, + Renderer2, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { CommonModule } from "@angular/common"; @@ -21,6 +22,7 @@ import { GoabControlValueAccessor } from "../base.component"; imports: [CommonModule], template: ` ).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; + // Keep local value in sync with emitted detail + this.value = detail.value || null; this.onChange.emit(detail); this.markAsTouched(); this.fcChange?.(detail.value || ""); } -} \ No newline at end of file +} diff --git a/libs/angular-components/src/lib/components/file-upload-card/file-upload-card.ts b/libs/angular-components/src/lib/components/file-upload-card/file-upload-card.ts index b499817b2b..81f1e18443 100644 --- a/libs/angular-components/src/lib/components/file-upload-card/file-upload-card.ts +++ b/libs/angular-components/src/lib/components/file-upload-card/file-upload-card.ts @@ -25,8 +25,8 @@ import { CommonModule } from "@angular/common"; [attr.progress]="progress" [attr.error]="error" [attr.testid]="testId" - (_cancel)="_onCancel()" - (_delete)="_onDelete()" + (_cancel)="_onCancel($event)" + (_delete)="_onDelete($event)" > `, schemas: [CUSTOM_ELEMENTS_SCHEMA], @@ -56,11 +56,11 @@ export class GoabFileUploadCard implements OnInit { }, 0); } - _onCancel() { - this.onCancel.emit({ filename: this.filename }); + _onCancel(event: Event) { + this.onCancel.emit({ filename: this.filename, event }); } - _onDelete() { - this.onDelete.emit({ filename: this.filename }); + _onDelete(event: Event) { + this.onDelete.emit({ filename: this.filename, event }); } } diff --git a/libs/angular-components/src/lib/components/file-upload-input/file-upload-input.ts b/libs/angular-components/src/lib/components/file-upload-input/file-upload-input.ts index b3edc4d362..a3af7b4d78 100644 --- a/libs/angular-components/src/lib/components/file-upload-input/file-upload-input.ts +++ b/libs/angular-components/src/lib/components/file-upload-input/file-upload-input.ts @@ -58,7 +58,7 @@ export class GoabFileUploadInput extends GoabBaseComponent implements OnInit { } _onSelectFile(e: Event) { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onSelectFile.emit(detail); } } diff --git a/libs/angular-components/src/lib/components/form-item/form-item.spec.ts b/libs/angular-components/src/lib/components/form-item/form-item.spec.ts index a58f43deee..fe2dc283da 100644 --- a/libs/angular-components/src/lib/components/form-item/form-item.spec.ts +++ b/libs/angular-components/src/lib/components/form-item/form-item.spec.ts @@ -66,6 +66,7 @@ describe("GoABFormItem", () => { component.mb = "l"; component.ml = "xl"; component.mr = "m"; + fixture.detectChanges(); tick(); fixture.detectChanges(); })); diff --git a/libs/angular-components/src/lib/components/index.ts b/libs/angular-components/src/lib/components/index.ts index e4da7ddca3..1204e799a5 100644 --- a/libs/angular-components/src/lib/components/index.ts +++ b/libs/angular-components/src/lib/components/index.ts @@ -15,6 +15,7 @@ export * from "./chip/chip"; export * from "./circular-progress/circular-progress"; export * from "./column-layout/column-layout"; export * from "./container/container"; +export * from "./data-grid/data-grid"; export * from "./date-picker/date-picker"; export * from "./details/details"; export * from "./divider/divider"; @@ -49,6 +50,7 @@ export * from "./icon/icon"; export * from "./icon-button/icon-button"; export * from "./input/input"; export * from "./input-number/input-number"; +export * from "./linear-progress/linear-progress"; export * from "./link/link"; export * from "./microsite-header/microsite-header"; export * from "./modal/modal"; diff --git a/libs/angular-components/src/lib/components/input-number/input-number.spec.ts b/libs/angular-components/src/lib/components/input-number/input-number.spec.ts index 7258e40800..e42e14c718 100644 --- a/libs/angular-components/src/lib/components/input-number/input-number.spec.ts +++ b/libs/angular-components/src/lib/components/input-number/input-number.spec.ts @@ -191,9 +191,11 @@ describe("GoabInputNumber", () => { const validateOnChange = jest.spyOn(component, "onChange"); const testValue = "99.9"; + const changeEvent = new Event("input"); const expectedDetail: GoabInputOnChangeDetail = { name: component.name, value: testValue, + event: changeEvent, }; fireEvent( diff --git a/libs/angular-components/src/lib/components/input/input.spec.ts b/libs/angular-components/src/lib/components/input/input.spec.ts index 27fd76e318..477d71a04c 100644 --- a/libs/angular-components/src/lib/components/input/input.spec.ts +++ b/libs/angular-components/src/lib/components/input/input.spec.ts @@ -222,7 +222,9 @@ describe("GoABInput", () => { new CustomEvent("_change", { detail: { name: "foo", value: "new value" } }), ); - expect(validateOnChange).toBeCalledWith({ name: "foo", value: "new value" }); + expect(validateOnChange).toBeCalledWith( + expect.objectContaining({ name: "foo", value: "new value", event: expect.any(Event) }), + ); }); it("should handle onFocus event", () => { @@ -266,6 +268,52 @@ describe("GoABInput", () => { expect(trailingContent).toBeTruthy(); expect(trailingContent.textContent).toContain("Trailing Content"); }); + + describe("writeValue", () => { + it("should set value attribute when writeValue is called", () => { + const inputComponent = fixture.debugElement.query(By.css("goab-input")).componentInstance; + const inputElement = fixture.debugElement.query(By.css("goa-input")).nativeElement; + + inputComponent.writeValue("new value"); + expect(inputElement.getAttribute("value")).toBe("new value"); + + inputComponent.writeValue("another value"); + expect(inputElement.getAttribute("value")).toBe("another value"); + }); + + it("should set value attribute to empty string when writeValue is called with null or empty", () => { + const inputComponent = fixture.debugElement.query(By.css("goab-input")).componentInstance; + const inputElement = fixture.debugElement.query(By.css("goa-input")).nativeElement; + + // First set a value + inputComponent.writeValue("some value"); + expect(inputElement.getAttribute("value")).toBe("some value"); + + // Then clear it with null + inputComponent.writeValue(null); + expect(inputElement.getAttribute("value")).toBe(""); + + // Set again and clear with undefined + inputComponent.writeValue("test"); + inputComponent.writeValue(undefined); + expect(inputElement.getAttribute("value")).toBe(""); + + // Set again and clear with empty string + inputComponent.writeValue("test2"); + inputComponent.writeValue(""); + expect(inputElement.getAttribute("value")).toBe(""); + }); + + it("should update component value property", () => { + const inputComponent = fixture.debugElement.query(By.css("goab-input")).componentInstance; + + inputComponent.writeValue("updated"); + expect(inputComponent.value).toBe("updated"); + + inputComponent.writeValue(null); + expect(inputComponent.value).toBe(null); + }); + }); }); @Component({ diff --git a/libs/angular-components/src/lib/components/input/input.ts b/libs/angular-components/src/lib/components/input/input.ts index f1d16292ec..50bcfc6d57 100644 --- a/libs/angular-components/src/lib/components/input/input.ts +++ b/libs/angular-components/src/lib/components/input/input.ts @@ -19,6 +19,7 @@ import { numberAttribute, TemplateRef, ChangeDetectorRef, + Renderer2, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { GoabControlValueAccessor } from "../base.component"; @@ -34,6 +35,7 @@ export interface IgnoreMe { imports: [NgIf, NgTemplateOutlet, CommonModule], template: ` ).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onChange.emit(detail); this.fcChange?.(detail.value); @@ -175,7 +180,7 @@ export class GoabInput extends GoabControlValueAccessor implements OnInit { _onKeyPress(e: Event) { this.markAsTouched(); - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onKeyPress.emit(detail); this.fcTouched?.(); @@ -183,12 +188,12 @@ export class GoabInput extends GoabControlValueAccessor implements OnInit { _onFocus(e: Event) { this.markAsTouched(); - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onFocus.emit(detail); } _onBlur(e: Event) { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onBlur.emit(detail); } diff --git a/libs/angular-components/src/lib/components/linear-progress/linear-progress.spec.ts b/libs/angular-components/src/lib/components/linear-progress/linear-progress.spec.ts new file mode 100644 index 0000000000..2452f242fa --- /dev/null +++ b/libs/angular-components/src/lib/components/linear-progress/linear-progress.spec.ts @@ -0,0 +1,76 @@ +import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { GoabLinearProgress } from "./linear-progress"; +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { By } from "@angular/platform-browser"; + +@Component({ + standalone: true, + imports: [GoabLinearProgress], + template: ` + + `, +}) +class TestLinearProgressComponent { + progress?: number; + testid?: string; + percentVisibility?: "visible" | "hidden" | undefined; + ariaLabel?: string; + ariaLabelledBy?: string; +} + +describe("GoABLinearProgress", () => { + let fixture: ComponentFixture; + let component: TestLinearProgressComponent; + const percentVisibility: "visible" | "hidden" | undefined = "visible"; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [GoabLinearProgress, TestLinearProgressComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(TestLinearProgressComponent); + component = fixture.componentInstance; + + component.testid = "foo"; + component.percentVisibility = percentVisibility; + component.ariaLabel = "ariaLabel"; + component.ariaLabelledBy = "ariaLabelledBy"; + + fixture.detectChanges(); + tick(); // Wait for component initialization + fixture.detectChanges(); + })); + + it("should not render anything when not visible", () => { + const el = fixture.debugElement.query(By.css("goa-linear-progress"))?.nativeElement; + expect(el?.innerHTML).toBeFalsy(); + }); + + it("should render correctly with various attribute values", () => { + const el = fixture.debugElement.query(By.css("goa-linear-progress"))?.nativeElement; + + expect(el?.getAttribute("testid")).toBe("foo"); + expect(el?.getAttribute("percent-visibility")).toBe(percentVisibility); + expect(el?.getAttribute("aria-label")).toBe("ariaLabel"); + expect(el?.getAttribute("aria-labelledby")).toBe("ariaLabelledBy"); + }); + + test.each([-1, 0, 10, 25, 50, 100])("Testing progress %s", (progress: number) => { + component.progress = progress; + component.percentVisibility = "visible"; + + fixture.detectChanges(); + + const el = fixture.debugElement.query(By.css("goa-linear-progress"))?.nativeElement; + + expect(el).toBeTruthy(); + expect(el?.getAttribute("progress")).toBe(`${progress}`); + }); +}); diff --git a/libs/angular-components/src/lib/components/linear-progress/linear-progress.ts b/libs/angular-components/src/lib/components/linear-progress/linear-progress.ts new file mode 100644 index 0000000000..f5d1d5fe85 --- /dev/null +++ b/libs/angular-components/src/lib/components/linear-progress/linear-progress.ts @@ -0,0 +1,46 @@ +import { + CUSTOM_ELEMENTS_SCHEMA, + Component, + Input, + OnInit, + ChangeDetectorRef, +} from "@angular/core"; +import { CommonModule } from "@angular/common"; + +@Component({ + standalone: true, + selector: "goab-linear-progress", + template: ` + + + `, + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [CommonModule], +}) +export class GoabLinearProgress implements OnInit { + @Input() progress?: number | null | undefined; + @Input() percentVisibility?: "visible" | "hidden" | undefined; + @Input() ariaLabel?: string; + @Input() ariaLabelledBy?: string; + @Input() testid?: string; + + isReady = false; + + constructor(private cdr: ChangeDetectorRef) {} + + ngOnInit(): void { + // For Angular 20, we need to delay rendering the web component + // to ensure all attributes are properly bound before the component initializes + setTimeout(() => { + this.isReady = true; + this.cdr.detectChanges(); + }, 0); + } +} diff --git a/libs/angular-components/src/lib/components/menu-button/menu-button.spec.ts b/libs/angular-components/src/lib/components/menu-button/menu-button.spec.ts new file mode 100644 index 0000000000..7ffcebf2f1 --- /dev/null +++ b/libs/angular-components/src/lib/components/menu-button/menu-button.spec.ts @@ -0,0 +1,95 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { GoabMenuButton } from "./menu-button"; +import { GoabMenuAction } from "./menu-action"; +import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { GoabButtonType, GoabIconType } from "@abgov/ui-components-common"; +import { By } from "@angular/platform-browser"; +import { fireEvent } from "@testing-library/dom"; + +@Component({ + standalone: true, + imports: [GoabMenuButton, GoabMenuAction], + template: ` + + + + + + + `, +}) +class TestMenuButtonComponent { + text?: string; + type?: GoabButtonType; + leadingIcon?: GoabIconType; + testId?: string; + + onAction(event: unknown) { + /* do nothing */ + } +} + +describe("GoabMenuButton", () => { + let fixture: ComponentFixture; + let component: TestMenuButtonComponent; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [GoabMenuButton, GoabMenuAction, TestMenuButtonComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(TestMenuButtonComponent); + component = fixture.componentInstance; + component.text = "Menu actions"; + component.type = "primary"; + component.leadingIcon = "alarm"; + component.testId = "test-menu-button"; + fixture.detectChanges(); + }); + + it("should render the properties", () => { + const menuButtonElement = fixture.debugElement.query( + By.css("goa-menu-button"), + ).nativeElement; + expect(menuButtonElement.getAttribute("text")).toBe("Menu actions"); + expect(menuButtonElement.getAttribute("type")).toBe("primary"); + expect(menuButtonElement.getAttribute("leading-icon")).toBe("alarm"); + expect(menuButtonElement.getAttribute("testid")).toBe("test-menu-button"); + }); + + it("should render with leading icon", () => { + const menuButtonElement = fixture.debugElement.query( + By.css("goa-menu-button"), + ).nativeElement; + expect(menuButtonElement.getAttribute("leading-icon")).toBe("alarm"); + }); + + it("should render without leading icon when not provided", () => { + component.leadingIcon = undefined; + fixture.detectChanges(); + + const menuButtonElement = fixture.debugElement.query( + By.css("goa-menu-button"), + ).nativeElement; + expect(menuButtonElement.getAttribute("leading-icon")).toBeNull(); + }); + + it("should respond to action event", () => { + const onAction = jest.spyOn(component, "onAction"); + const menuButtonElement = fixture.debugElement.query( + By.css("goa-menu-button"), + ).nativeElement; + + const mockDetail = { action: "action1", text: "Action 1" }; + fireEvent(menuButtonElement, new CustomEvent("_action", { detail: mockDetail })); + + expect(onAction).toHaveBeenCalledWith(mockDetail); + }); +}); diff --git a/libs/angular-components/src/lib/components/menu-button/menu-button.ts b/libs/angular-components/src/lib/components/menu-button/menu-button.ts index 0434033018..aba646b143 100644 --- a/libs/angular-components/src/lib/components/menu-button/menu-button.ts +++ b/libs/angular-components/src/lib/components/menu-button/menu-button.ts @@ -1,5 +1,15 @@ -import { GoabButtonType, GoabMenuButtonOnActionDetail } from "@abgov/ui-components-common"; -import { CUSTOM_ELEMENTS_SCHEMA, Component, Input, Output, EventEmitter } from "@angular/core"; +import { + GoabButtonType, + GoabIconType, + GoabMenuButtonOnActionDetail, +} from "@abgov/ui-components-common"; +import { + CUSTOM_ELEMENTS_SCHEMA, + Component, + Input, + Output, + EventEmitter, +} from "@angular/core"; @Component({ standalone: true, @@ -9,6 +19,8 @@ import { CUSTOM_ELEMENTS_SCHEMA, Component, Input, Output, EventEmitter } from " @@ -20,6 +32,8 @@ import { CUSTOM_ELEMENTS_SCHEMA, Component, Input, Output, EventEmitter } from " export class GoabMenuButton { @Input() text?: string; @Input() type?: GoabButtonType; + @Input() maxWidth?: string; + @Input() leadingIcon?: GoabIconType; @Input() testId?: string; @Output() onAction = new EventEmitter(); diff --git a/libs/angular-components/src/lib/components/radio-group/radio-group.spec.ts b/libs/angular-components/src/lib/components/radio-group/radio-group.spec.ts index 353f32d4b5..c5de076d1f 100644 --- a/libs/angular-components/src/lib/components/radio-group/radio-group.spec.ts +++ b/libs/angular-components/src/lib/components/radio-group/radio-group.spec.ts @@ -8,6 +8,7 @@ import { } from "@abgov/ui-components-common"; import { GoabRadioItem } from "../radio-item/radio-item"; import { fireEvent } from "@testing-library/dom"; +import { By } from "@angular/platform-browser"; import { CommonModule } from "@angular/common"; interface RadioOption { @@ -78,7 +79,7 @@ describe("GoABRadioGroup", () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [GoabRadioGroup, GoabRadioItem, TestRadioGroupComponent], + imports: [TestRadioGroupComponent, GoabRadioGroup, GoabRadioItem], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); @@ -136,14 +137,12 @@ describe("GoABRadioGroup", () => { }); }); - it("should render description", fakeAsync(() => { + it("should render description", () => { component.options.forEach((option, index) => { component.options[index].description = `Description for ${component.options[index].text}`; }); component.options[0].isDescriptionSlot = true; fixture.detectChanges(); - tick(); - fixture.detectChanges(); const radioGroup = fixture.nativeElement.querySelector("goa-radio-group"); expect(radioGroup).toBeTruthy(); @@ -157,16 +156,65 @@ describe("GoABRadioGroup", () => { // attribute description expect(radioItems[1].getAttribute("description")).toBe(`Description for ${component.options[1].text}`); expect(radioItems[2].getAttribute("description")).toBe(`Description for ${component.options[2].text}`); - })); + }); it("should dispatch onChange", () => { const onChange = jest.spyOn(component, "onChange"); + const changeEvent = new Event("change"); const radioGroup = fixture.nativeElement.querySelector("goa-radio-group"); fireEvent(radioGroup, new CustomEvent("_change", { - detail: { "name": component.name, value: component.options[0].value } + detail: { name: component.name, value: component.options[0].value, event: changeEvent } })); - expect(onChange).toBeCalledWith({ name: component.name, value: component.options[0].value }); - }) + expect(onChange).toBeCalledWith( + expect.objectContaining({ name: component.name, value: component.options[0].value, event: expect.any(Event) }), + ); + }); + + describe("writeValue", () => { + it("should set value attribute when writeValue is called", () => { + const radioGroupComponent = fixture.debugElement.query(By.css("goab-radio-group")).componentInstance; + const radioGroupElement = fixture.nativeElement.querySelector("goa-radio-group"); + + radioGroupComponent.writeValue("apples"); + expect(radioGroupElement.getAttribute("value")).toBe("apples"); + + radioGroupComponent.writeValue("oranges"); + expect(radioGroupElement.getAttribute("value")).toBe("oranges"); + }); + + it("should set value attribute to empty string when writeValue is called with null or empty", () => { + const radioGroupComponent = fixture.debugElement.query(By.css("goab-radio-group")).componentInstance; + const radioGroupElement = fixture.nativeElement.querySelector("goa-radio-group"); + + // First set a value + radioGroupComponent.writeValue("bananas"); + expect(radioGroupElement.getAttribute("value")).toBe("bananas"); + + // Then clear it with null + radioGroupComponent.writeValue(null); + expect(radioGroupElement.getAttribute("value")).toBe(""); + + // Set again and clear with undefined + radioGroupComponent.writeValue("apples"); + radioGroupComponent.writeValue(undefined); + expect(radioGroupElement.getAttribute("value")).toBe(""); + + // Set again and clear with empty string + radioGroupComponent.writeValue("oranges"); + radioGroupComponent.writeValue(""); + expect(radioGroupElement.getAttribute("value")).toBe(""); + }); + + it("should update component value property", () => { + const radioGroupComponent = fixture.debugElement.query(By.css("goab-radio-group")).componentInstance; + + radioGroupComponent.writeValue("apples"); + expect(radioGroupComponent.value).toBe("apples"); + + radioGroupComponent.writeValue(null); + expect(radioGroupComponent.value).toBe(null); + }); + }); }); diff --git a/libs/angular-components/src/lib/components/radio-group/radio-group.ts b/libs/angular-components/src/lib/components/radio-group/radio-group.ts index a2284c6128..9216b0434c 100644 --- a/libs/angular-components/src/lib/components/radio-group/radio-group.ts +++ b/libs/angular-components/src/lib/components/radio-group/radio-group.ts @@ -11,6 +11,7 @@ import { forwardRef, OnInit, ChangeDetectorRef, + Renderer2, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { CommonModule } from "@angular/common"; @@ -21,6 +22,7 @@ import { GoabControlValueAccessor } from "../base.component"; selector: "goab-radio-group", template: ` (); _onChange(e: Event) { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.markAsTouched(); this.onChange.emit(detail); diff --git a/libs/angular-components/src/lib/components/tab/tab.ts b/libs/angular-components/src/lib/components/tab/tab.ts index 0f95902f65..37c982ceaa 100644 --- a/libs/angular-components/src/lib/components/tab/tab.ts +++ b/libs/angular-components/src/lib/components/tab/tab.ts @@ -1,11 +1,11 @@ -import { CUSTOM_ELEMENTS_SCHEMA, Component, Input, TemplateRef, OnInit, ChangeDetectorRef } from "@angular/core"; +import { CUSTOM_ELEMENTS_SCHEMA, Component, Input, TemplateRef, OnInit, ChangeDetectorRef, booleanAttribute } from "@angular/core"; import { NgTemplateOutlet, CommonModule } from "@angular/common"; @Component({ standalone: true, selector: "goab-tab", template: ` - +
@@ -19,6 +19,7 @@ import { NgTemplateOutlet, CommonModule } from "@angular/common"; export class GoabTab implements OnInit { isReady = false; @Input() heading!: string | TemplateRef; + @Input({ transform: booleanAttribute }) disabled?: boolean; constructor(private cdr: ChangeDetectorRef) {} diff --git a/libs/angular-components/src/lib/components/tabs/tabs.ts b/libs/angular-components/src/lib/components/tabs/tabs.ts index eb10265c9c..075e74bb16 100644 --- a/libs/angular-components/src/lib/components/tabs/tabs.ts +++ b/libs/angular-components/src/lib/components/tabs/tabs.ts @@ -9,7 +9,7 @@ import { ChangeDetectorRef, } from "@angular/core"; import { CommonModule } from "@angular/common"; -import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; +import { GoabTabsOnChangeDetail, GoabTabsVariant } from "@abgov/ui-components-common"; @Component({ standalone: true, @@ -19,6 +19,7 @@ import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; *ngIf="isReady" [attr.initialtab]="initialTab" [attr.testid]="testId" + [attr.variant]="variant" (_change)="_onChange($event)" > @@ -31,6 +32,7 @@ export class GoabTabs implements OnInit { isReady = false; @Input({ transform: numberAttribute }) initialTab?: number; @Input() testId?: string; + @Input() variant?: GoabTabsVariant; constructor(private cdr: ChangeDetectorRef) {} diff --git a/libs/angular-components/src/lib/components/text/text.spec.ts b/libs/angular-components/src/lib/components/text/text.spec.ts index 9a1e0e04f3..47ed1784b2 100644 --- a/libs/angular-components/src/lib/components/text/text.spec.ts +++ b/libs/angular-components/src/lib/components/text/text.spec.ts @@ -1,15 +1,15 @@ -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { GoabText } from './text'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { GoabText } from "./text"; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; -describe('GoabText', () => { +describe("GoabText", () => { let component: GoabText; let fixture: ComponentFixture; beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ imports: [GoabText], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); fixture = TestBed.createComponent(GoabText); @@ -19,12 +19,12 @@ describe('GoabText', () => { fixture.detectChanges(); })); - it('should create', () => { + it("should create", () => { expect(component).toBeTruthy(); }); - it('should render text content', fakeAsync(() => { - const testText = 'Test Content'; + it("should render text content", fakeAsync(() => { + const testText = "Test Content"; const compiled = fixture.nativeElement as HTMLElement; compiled.innerHTML = testText; fixture.detectChanges(); @@ -34,43 +34,56 @@ describe('GoabText', () => { expect(compiled.textContent).toContain(testText); })); - it('should render with all properties', fakeAsync(() => { - component.tag = 'h1'; - component.maxWidth = '100px'; - component.size = 'heading-xl'; - component.color = 'secondary'; - component.mt = 's'; - component.mr = 'm'; - component.mb = 'l'; - component.ml = 'xl'; + it("should render with all properties", fakeAsync(() => { + component.tag = "h1"; + component.maxWidth = "100px"; + component.size = "heading-xl"; + component.color = "secondary"; + component.mt = "s"; + component.mr = "m"; + component.mb = "l"; + component.ml = "xl"; fixture.detectChanges(); tick(); fixture.detectChanges(); - const element = fixture.nativeElement.querySelector('goa-text'); - expect(element.getAttribute('as')).toBe('h1'); - expect(element.getAttribute('maxwidth')).toBe('100px'); - expect(element.getAttribute('size')).toBe('heading-xl'); - expect(element.getAttribute('color')).toBe('secondary'); - expect(element.getAttribute('mt')).toBe('s'); - expect(element.getAttribute('mr')).toBe('m'); - expect(element.getAttribute('mb')).toBe('l'); - expect(element.getAttribute('ml')).toBe('xl'); + const element = fixture.nativeElement.querySelector("goa-text"); + expect(element.getAttribute("as")).toBe("h1"); + expect(element.getAttribute("maxwidth")).toBe("100px"); + expect(element.getAttribute("size")).toBe("heading-xl"); + expect(element.getAttribute("color")).toBe("secondary"); + expect(element.getAttribute("mt")).toBe("s"); + expect(element.getAttribute("mr")).toBe("m"); + expect(element.getAttribute("mb")).toBe("l"); + expect(element.getAttribute("ml")).toBe("xl"); })); - it('should handle undefined properties', fakeAsync(() => { + it("should handle undefined properties", fakeAsync(() => { fixture.detectChanges(); tick(); fixture.detectChanges(); - const element = fixture.nativeElement.querySelector('goa-text'); + const element = fixture.nativeElement.querySelector("goa-text"); - expect(element.getAttribute('as')).toBeNull(); - expect(element.getAttribute('maxwidth')).toBeNull(); - expect(element.getAttribute('size')).toBeNull(); - expect(element.getAttribute('color')).toBeNull(); - expect(element.getAttribute('mt')).toBeNull(); - expect(element.getAttribute('mr')).toBeNull(); - expect(element.getAttribute('mb')).toBeNull(); - expect(element.getAttribute('ml')).toBeNull(); + expect(element.getAttribute("as")).toBeNull(); + expect(element.getAttribute("maxwidth")).toBeNull(); + expect(element.getAttribute("size")).toBeNull(); + expect(element.getAttribute("color")).toBeNull(); + expect(element.getAttribute("mt")).toBeNull(); + expect(element.getAttribute("mr")).toBeNull(); + expect(element.getAttribute("mb")).toBeNull(); + expect(element.getAttribute("ml")).toBeNull(); + })); + + it("should apply id to the host element only", fakeAsync(() => { + component.id = "text-id"; + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + const host = fixture.nativeElement as HTMLElement; + const inner = host.querySelector("goa-text"); + + expect(host.getAttribute("id")).toBe("text-id"); + expect(inner?.getAttribute("id")).toBeNull(); })); }); diff --git a/libs/angular-components/src/lib/components/text/text.ts b/libs/angular-components/src/lib/components/text/text.ts index b7b0ddbcda..0ee46c4eeb 100644 --- a/libs/angular-components/src/lib/components/text/text.ts +++ b/libs/angular-components/src/lib/components/text/text.ts @@ -4,6 +4,7 @@ import { Input, OnInit, ChangeDetectorRef, + HostBinding, } from "@angular/core"; import { CommonModule } from "@angular/common"; import { @@ -11,12 +12,13 @@ import { GoabTextHeadingElement, GoabTextMaxWidth, GoabTextSize, - GoabTextTextElement, Spacing, + GoabTextTextElement, + Spacing, } from "@abgov/ui-components-common"; @Component({ standalone: true, - selector: 'goab-text', + selector: "goab-text", imports: [CommonModule], template: ` + [attr.mr]="mr" + > `, - schemas: [CUSTOM_ELEMENTS_SCHEMA] + schemas: [CUSTOM_ELEMENTS_SCHEMA], }) export class GoabText implements OnInit { @Input() tag?: GoabTextTextElement | GoabTextHeadingElement; @Input() size?: GoabTextSize; @Input() maxWidth?: GoabTextMaxWidth; @Input() color?: GoabTextColor; + @Input() id?: string; + /* + This is necessary because angular outputs two elements, and + This removes the id from and only outputs it to + */ + @HostBinding("attr.id") get hostId() { + return this.id; + } @Input() mt?: Spacing; @Input() mb?: Spacing; @Input() ml?: Spacing; diff --git a/libs/angular-components/src/lib/components/textarea/textarea.spec.ts b/libs/angular-components/src/lib/components/textarea/textarea.spec.ts index 772ba38494..d3c3cfae34 100644 --- a/libs/angular-components/src/lib/components/textarea/textarea.spec.ts +++ b/libs/angular-components/src/lib/components/textarea/textarea.spec.ts @@ -3,6 +3,7 @@ import { GoabTextArea } from "./textarea"; import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; import { GoabTextAreaCountBy, Spacing } from "@abgov/ui-components-common"; import { fireEvent } from "@testing-library/dom"; +import { By } from "@angular/platform-browser"; @Component({ standalone: true, @@ -126,4 +127,50 @@ describe("GoABTextArea", () => { expect(onBlur).toBeCalledTimes(1); }); + + describe("writeValue", () => { + it("should set value attribute when writeValue is called", () => { + const textareaComponent = fixture.debugElement.query(By.css("goab-textarea")).componentInstance; + const textareaElement = fixture.nativeElement.querySelector("goa-textarea"); + + textareaComponent.writeValue("new content"); + expect(textareaElement.getAttribute("value")).toBe("new content"); + + textareaComponent.writeValue("updated content"); + expect(textareaElement.getAttribute("value")).toBe("updated content"); + }); + + it("should set value attribute to empty string when writeValue is called with null or empty", () => { + const textareaComponent = fixture.debugElement.query(By.css("goab-textarea")).componentInstance; + const textareaElement = fixture.nativeElement.querySelector("goa-textarea"); + + // First set a value + textareaComponent.writeValue("some content"); + expect(textareaElement.getAttribute("value")).toBe("some content"); + + // Then clear it with null + textareaComponent.writeValue(null); + expect(textareaElement.getAttribute("value")).toBe(""); + + // Set again and clear with undefined + textareaComponent.writeValue("test content"); + textareaComponent.writeValue(undefined); + expect(textareaElement.getAttribute("value")).toBe(""); + + // Set again and clear with empty string + textareaComponent.writeValue("more content"); + textareaComponent.writeValue(""); + expect(textareaElement.getAttribute("value")).toBe(""); + }); + + it("should update component value property", () => { + const textareaComponent = fixture.debugElement.query(By.css("goab-textarea")).componentInstance; + + textareaComponent.writeValue("updated value"); + expect(textareaComponent.value).toBe("updated value"); + + textareaComponent.writeValue(null); + expect(textareaComponent.value).toBe(null); + }); + }); }); diff --git a/libs/angular-components/src/lib/components/textarea/textarea.ts b/libs/angular-components/src/lib/components/textarea/textarea.ts index 453371b511..e63ac3b530 100644 --- a/libs/angular-components/src/lib/components/textarea/textarea.ts +++ b/libs/angular-components/src/lib/components/textarea/textarea.ts @@ -15,6 +15,7 @@ import { numberAttribute, OnInit, ChangeDetectorRef, + Renderer2, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { CommonModule } from "@angular/common"; @@ -26,6 +27,7 @@ import { GoabControlValueAccessor } from "../base.component"; imports: [CommonModule], template: ` ).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.onChange.emit(detail); this.markAsTouched(); this.fcChange?.(detail.value); } _onKeyPress(e: Event) { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.markAsTouched(); this.onKeyPress.emit(detail); } _onBlur(e: Event) { - const detail = (e as CustomEvent).detail; + const detail = { ...(e as CustomEvent).detail, event: e }; this.markAsTouched(); this.onBlur.emit(detail); } diff --git a/libs/common/src/lib/common.ts b/libs/common/src/lib/common.ts index d82133d96b..af45326cad 100644 --- a/libs/common/src/lib/common.ts +++ b/libs/common/src/lib/common.ts @@ -5,16 +5,19 @@ export type GoabSpinnerSize = "small" | "medium" | "large" | "xlarge"; export type GoabRadioGroupOnChangeDetail = { name: string; value: string; + event: Event; }; export type GoabCheckboxListOnChangeDetail = { name: string; value: string[]; + event: Event; }; export type GoabInputOnChangeDetail = { name: string; value: T; + event: Event; }; // @deprecated GoaInputOnBlurDetail has been deprecated. Use GoabInputOnBlurDetail instead. @@ -22,13 +25,14 @@ export type GoaInputOnBlurDetail = GoabInputOnBlurDetail; export type GoabInputOnBlurDetail = { name: string; value: T; + event: Event; }; export type GoabInputOnFocusDetail = GoabInputOnChangeDetail; export type GoabMenuButtonOnActionDetail = { action: string; -} +}; export type GoabInputAutoCapitalize = | "on" @@ -42,6 +46,7 @@ export type GoabInputOnKeyPressDetail = { name: string; value: T; key: T; + event: Event; }; export type GoabFormStepperOnChangeDetail = { @@ -50,14 +55,17 @@ export type GoabFormStepperOnChangeDetail = { export type GoabFileUploadInputOnSelectFileDetail = { file: File; + event: Event; }; export type GoabFileUploadOnCancelDetail = { filename: string; + event: Event; }; export type GoabFileUploadOnDeleteDetail = { filename: string; + event: Event; }; export type GoabDropdownItemMountType = "append" | "prepend" | "reset"; @@ -66,11 +74,17 @@ export type GoabDropdownOnChangeDetail = { name?: string; value?: string; values?: string[]; + event: Event; }; export type GoabDatePickerOnChangeDetail = { name?: string; - value: string | Date | undefined; + valueStr: string; + /** + * @deprecated Use `valueStr` instead + */ + value: Date; + event: Event; }; export type GoabDatePickerInputType = "calendar" | "input"; @@ -84,6 +98,7 @@ export type GoabCheckboxOnChangeDetail = { value?: string; checked: boolean; binding: "value" | "check"; + event: Event; }; export type GoabCalendarOnChangeDetail = { @@ -185,23 +200,29 @@ export type GoabTextAreaCountBy = "character" | "word" | ""; export type GoabTextAreaOnChangeDetail = { name: string; value: string; + event: Event; }; export type GoabTextAreaOnKeyPressDetail = { name: string; value: string; key: string; + event: Event; }; export type GoabTextAreaOnBlurDetail = { name: string; value: string; + event: Event; }; // Tabs +export type GoabTabsVariant = "default" | "segmented"; + export interface GoabTabsProps { initialTab?: number; + variant?: GoabTabsVariant; } export type GoabTabsOnChangeDetail = { @@ -352,10 +373,15 @@ export type GoabAutoCapitalize = | "words" | "characters"; -export type OnChange = (name: string, value: T) => void; -export type OnFocus = (name: string, value: T) => void; -export type OnBlur = (name: string, value: T) => void; -export type OnKeyPress = (name: string, value: T, key: string) => void; +export type OnChange = (name: string, value: T, event: Event) => void; +export type OnFocus = (name: string, value: T, event: Event) => void; +export type OnBlur = (name: string, value: T, event: Event) => void; +export type OnKeyPress = ( + name: string, + value: T, + key: string, + event: Event, +) => void; export interface GoabInputProps extends BaseProps { onChange: OnChange; @@ -418,8 +444,7 @@ interface BaseProps extends Margins { // Icon -export type GoabIconFilledType = `${GoabIconType}-${GoabIconTheme}`; -export type GoabIconType = +export type GoabIconBaseType = | "accessibility" | "add-circle" | "add" @@ -1017,6 +1042,8 @@ export type GoabIconOverridesType = | "warning-filled" | "warning"; +export type GoabIconType = GoabIconBaseType | `${GoabIconBaseType}:${GoabIconTheme}`; + export type GoabIconSize = | "1" | "2" @@ -1069,6 +1096,10 @@ export type TShirtSpacing = export type Spacing = NumericSpacing | TShirtSpacing | null; +export type DataAttributes = { + [K in `data-${string}`]?: string | boolean; +}; + export interface Margins { mt?: Spacing; mr?: Spacing; @@ -1158,11 +1189,13 @@ export type GoabPublicFormStatus = "initializing" | "complete"; export type GoabPublicFormPageStep = "step" | "summary" | "multistep"; export type GoabPublicFormPageButtonVisibility = "visible" | "hidden"; - // Public form Task export type GoabPublicFormTaskStatus = "completed" | "not-started" | "cannot-start"; // Drawer export type GoabDrawerPosition = "bottom" | "left" | "right" | undefined; -export type GoabDrawerSizeUnit = "px" | "rem" | "ch" | "vh" | "vw"; +export type GoabDrawerSizeUnit = "px" | "rem" | "ch" | "vh" | "vw" | "%"; export type GoabDrawerSize = `${number}${GoabDrawerSizeUnit}` | undefined; + +// Work side menu +export type GoabWorkSideMenuItemType = "normal" | "emergency" | "success"; diff --git a/libs/react-components/project.json b/libs/react-components/project.json index eb588b7fe5..dfc21999c4 100644 --- a/libs/react-components/project.json +++ b/libs/react-components/project.json @@ -4,22 +4,15 @@ "sourceRoot": "libs/react-components/src", "projectType": "library", "tags": [], - "implicitDependencies": [ - "web-components", - "common" - ], + "implicitDependencies": ["web-components", "common"], "targets": { "lint": { "executor": "@nx/eslint:lint", - "outputs": [ - "{options.outputFile}" - ] + "outputs": ["{options.outputFile}"] }, "build": { "executor": "@nx/vite:build", - "outputs": [ - "{options.outputPath}" - ], + "outputs": ["{options.outputPath}"], "defaultConfiguration": "production", "options": { "outputPath": "dist/libs/react-components", @@ -36,10 +29,8 @@ } }, "test": { - "executor": "@nx/vite:test", - "outputs": [ - "{options.reportsDirectory}" - ], + "executor": "@nx/vitest:test", + "outputs": ["{options.reportsDirectory}"], "options": { "reportsDirectory": "../../coverage/libs/react-components" } diff --git a/libs/react-components/specs/calendar.browser.spec.tsx b/libs/react-components/specs/calendar.browser.spec.tsx index 5a54fe9124..8c34b4546b 100644 --- a/libs/react-components/specs/calendar.browser.spec.tsx +++ b/libs/react-components/specs/calendar.browser.spec.tsx @@ -2,30 +2,720 @@ import { render } from "vitest-browser-react"; import { GoabCalendar } from "../src"; import { expect, describe, it, vi } from "vitest"; +import { userEvent } from "@vitest/browser/context"; +import { format, addDays, addMonths, addYears } from "date-fns"; describe("Calendar", () => { const noop = () => { // noop }; + it("renders", async () => { + const handleChange = vi.fn(); + + const Component = () => { + return ; + }; + + const result = render(); + + await vi.waitFor(() => { + const calendar = result.getByTestId("cal"); + expect(calendar.element()).toBeTruthy(); + }); + }); + + it("renders with a value", async () => { + const value = "2024-03-15"; + const handleChange = vi.fn(); + + const Component = () => { + return ; + }; + + const result = render(); + const selectedDate = result.getByTestId("2024-03-15"); + + await vi.waitFor(() => { + expect(selectedDate.element()).toBeTruthy(); + expect(selectedDate.element().classList.contains("selected")).toBe(true); + }); + }); + + it("dispatches change event when clicked", async () => { + const handleChange = vi.fn(); + const today = new Date(); + const todayStr = format(today, "yyyy-MM-dd"); + + const Component = () => { + return ; + }; + + const result = render(); + const dateButton = result.getByTestId(todayStr); + + await dateButton.click(); + + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "birthdate", + value: expect.any(String), + }); + }); + }); + + it("respects min date constraint", async () => { + const handleChange = vi.fn(); + const value = "2025-11-15"; + const today = new Date(value); + const minDate = format(today, "yyyy-MM-dd"); + const pastDate = format(addDays(today, -5), "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const pastDateButton = result.getByTestId(pastDate); + + await vi.waitFor(() => { + expect(pastDateButton.element().classList.contains("disabled")).toBe(true); + }); + + await pastDateButton.click(); + + // Should not trigger change for disabled date + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(handleChange).not.toHaveBeenCalled(); + }); + + it("respects max date constraint", async () => { + const handleChange = vi.fn(); + const testDate = new Date(2024, 2, 15); // March 15, 2024 + const maxDate = format(testDate, "yyyy-MM-dd"); + const futureDate = format(addDays(testDate, 5), "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + + // Wait for component to render + await vi.waitFor(() => { + expect(result.getByTestId("cal-test").element()).toBeTruthy(); + }); + + const futureDateButton = result.getByTestId(futureDate); + + await vi.waitFor(() => { + expect(futureDateButton.element().classList.contains("disabled")).toBe(true); + }); + + await futureDateButton.click(); + + // Should not trigger change for disabled date + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(handleChange).not.toHaveBeenCalled(); + }); + + describe("Month and Year selection", () => { + it("changes the month when month dropdown is changed", async () => { + const handleChange = vi.fn(); + + const Component = () => { + return ( +
+ +
+ ); + }; + + const result = render(); + + const monthsDropdown = result.getByTestId("months"); + const june = result.getByTestId("dropdown-item-6"); + const firstDayOfJune = result.getByTestId("2024-06-01"); + + // select June + await monthsDropdown.click(); + await june.click(); + + // Wait for dropdown to be interactive + await vi.waitFor(() => { + expect(firstDayOfJune).toBeVisible(); + }); + }); + + it("changes the year when year dropdown is changed", async () => { + const handleChange = vi.fn(); + + const Component = () => { + return ( +
+ +
+ ); + }; + + const result = render(); + const yearsDropdown = result.getByTestId("years"); + const nextYear = result.getByTestId("dropdown-item-2025"); + const firstDay = result.getByTestId("2025-03-01"); + + // select June + await yearsDropdown.click(); + await nextYear.click(); + + // Wait for dropdown to be interactive + await vi.waitFor(() => { + expect(firstDay).toBeVisible(); + }); + }); + }); + + describe("Keyboard Navigation", () => { + it("navigates to previous day with ArrowLeft and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initialDate = result.getByTestId(startDateStr); + + await initialDate.click(); + await userEvent.keyboard("{ArrowLeft}"); + await userEvent.keyboard("{Enter}"); + + const prevDate = format(addDays(startDate, -1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(prevDate), + }); + }); + }); + + it("navigates to next day with ArrowRight and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{ArrowRight}"); + await userEvent.keyboard("{Enter}"); + + const nextDate = format(addDays(startDate, 1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(nextDate), + }); + }); + }); + + it("navigates to previous week with ArrowUp and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{ArrowUp}"); + await userEvent.keyboard("{Enter}"); + + const prevWeekDate = format(addDays(startDate, -7), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(prevWeekDate), + }); + }); + }); + + it("navigates to next week with ArrowDown and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{ArrowDown}"); + await userEvent.keyboard("{Enter}"); + + const nextWeekDate = format(addDays(startDate, 7), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(nextWeekDate), + }); + }); + }); + + it("navigates to first day of month with Home and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{Home}"); + await userEvent.keyboard("{Enter}"); + + const firstDay = format(new Date(2024, 2, 1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(firstDay), + }); + }); + }); + + it("navigates to last day of month with End and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{End}"); + await userEvent.keyboard("{Enter}"); + + const lastDay = format(new Date(2024, 2, 31), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(lastDay), + }); + }); + }); + + it("navigates to previous month with PageUp and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{PageUp}"); + await userEvent.keyboard("{Enter}"); + + const prevMonthDate = format(addMonths(startDate, -1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(prevMonthDate), + }); + }); + }); + + it("navigates to next month with PageDown and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{PageDown}"); + await userEvent.keyboard("{Enter}"); + + const nextMonthDate = format(addMonths(startDate, 1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(nextMonthDate), + }); + }); + }); + + it("navigates to previous year with Shift+PageUp and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{Shift>}{PageUp}"); + await userEvent.keyboard("{Enter}"); + + const prevYearDate = format(addYears(startDate, -1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(prevYearDate), + }); + }); + }); + + it("navigates to next year with Shift+PageDown and selects with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{Shift>}{PageDown}"); + await userEvent.keyboard("{Enter}"); + + const nextYearDate = format(addYears(startDate, 1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(nextYearDate), + }); + }); + }); + + it("selects the focused date with Enter", async () => { + const handleChange = vi.fn(); + const startDate = new Date(2024, 2, 15); // March 15, 2024 + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{ArrowRight}"); // Move to next day + await userEvent.keyboard("{Enter}"); // Select it + + const expectedDate = format(addDays(startDate, 1), "yyyy-MM-dd"); + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(expectedDate), + }); + }); + }); + + it("does not navigate beyond min date constraint", async () => { + const handleChange = vi.fn(); + const minDate = new Date(2024, 2, 10); // March 10, 2024 + const startDate = new Date(2024, 2, 11); // March 11, 2024 + const minDateStr = format(minDate, "yyyy-MM-dd"); + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{ArrowLeft}"); // Try to move before min + await userEvent.keyboard("{Enter}"); // Try to select + + // Should still select March 11 (start date), not March 10 + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(startDateStr), + }); + }); + }); + + it("does not navigate beyond max date constraint", async () => { + const handleChange = vi.fn(); + const maxDate = new Date(2024, 2, 20); // March 20, 2024 + const startDate = new Date(2024, 2, 19); // March 19, 2024 + const maxDateStr = format(maxDate, "yyyy-MM-dd"); + const startDateStr = format(startDate, "yyyy-MM-dd"); + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const initDate = result.getByTestId(startDateStr); + + await initDate.click(); + await userEvent.keyboard("{ArrowRight}"); // Try to move after max + await userEvent.keyboard("{Enter}"); // Try to select + + // Should still select March 19 (start date), not March 20 + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: expect.stringContaining(startDateStr), + }); + }); + }); + }); + + describe("Visual states", () => { + it("highlights today's date", async () => { + const handleChange = vi.fn(); + const today = new Date(); + const todayStr = format(today, "yyyy-MM-dd"); + + const Component = () => { + return ; + }; + + const result = render(); + const todayButton = result.getByTestId(todayStr); + + await vi.waitFor(() => { + expect(todayButton.element().classList.contains("today")).toBe(true); + }); + }); + + it("highlights the selected date", async () => { + const handleChange = vi.fn(); + const selectedDate = "2024-03-15"; + + const Component = () => { + return ( + + ); + }; + + const result = render(); + const selectedButton = result.getByTestId(selectedDate); + + await vi.waitFor(() => { + expect(selectedButton.element().classList.contains("selected")).toBe(true); + }); + }); + + it("displays days from previous and next months", async () => { + const handleChange = vi.fn(); + const testDate = "2024-03-15"; // March 2024 + + const Component = () => { + return ( + + ); + }; + + const result = render(); + + // March 1, 2024 is a Friday, so we should see days from previous month + // Last days of February 2024 + const lastDayOfFeb = result.getByTestId("2024-02-29"); // Leap year + + await vi.waitFor(() => { + expect(lastDayOfFeb.element()).toBeTruthy(); + expect(lastDayOfFeb.element().classList.contains("other-month")).toBe(true); + }); + }); + }); + + describe("Edge cases", () => { + it("handles leap year correctly", async () => { + const handleChange = vi.fn(); + const leapDay = "2024-02-29"; + + const Component = () => { + return ; + }; + + const result = render(); + const leapDayButton = result.getByTestId(leapDay); + + await vi.waitFor(() => { + expect(leapDayButton.element()).toBeTruthy(); + expect(leapDayButton.element().classList.contains("selected")).toBe(true); + }); + }); + + it("handles month transitions when selecting dates from other months", async () => { + const handleChange = vi.fn(); + const testDate = "2024-03-01"; // March 1, 2024 (Friday) + + const Component = () => { + return ( + + ); + }; + + const result = render(); + + // Click on a day from February (displayed at the beginning of March calendar) + const febDay = result.getByTestId("2024-02-29"); + await febDay.click(); + + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledWith({ + name: "", + value: "2024-02-29", + }); + }); + }); + }); + describe("Bug fixes", () => { describe("3156", () => { it("should render all months", async () => { - // The calendar contained falsey values const Component = () => { - return ( - - ); + return ; }; const result = render(); - const falseyOption = result.getByTestId("dropdown-item-0"); + const falseyOption = result.getByTestId("dropdown-item-1"); await vi.waitFor(() => { expect(falseyOption.element()).toBeTruthy(); - }) - }) - }) - }) + }); + }); + }); + }); }); diff --git a/libs/react-components/specs/checkbox-list.browser.spec.tsx b/libs/react-components/specs/checkbox-list.browser.spec.tsx index c8a8ecf89d..652cc20e74 100644 --- a/libs/react-components/specs/checkbox-list.browser.spec.tsx +++ b/libs/react-components/specs/checkbox-list.browser.spec.tsx @@ -2,6 +2,7 @@ import { render } from "vitest-browser-react"; import { GoabCheckboxList, GoabCheckbox } from "../src"; import { expect, describe, it, vi } from "vitest"; import { useState } from "react"; +import { userEvent } from "@vitest/browser/context"; describe("CheckboxList", () => { it("should render a checkbox list with basic properties", async () => { @@ -239,42 +240,30 @@ describe("CheckboxList", () => { expect(result.getByTestId("checkbox-list")).toBeTruthy(); }); - it("should handle onChange callback with correct event details", async () => { - const onChangeSpy = vi.fn(); - - const Component = () => { - return ( -
- - - - -
- ); - }; + it("passes the browser event in change detail", async () => { + const onChange = vi.fn(); + + const Component = () => ( + + + + ); const result = render(); + const checkbox = result.getByTestId("event-checkbox-1"); - await new Promise((resolve) => setTimeout(resolve, 200)); - - const checkbox1 = result.getByTestId("checkbox-1"); - - // Click checkbox - await checkbox1.click(); + await userEvent.click(checkbox); await vi.waitFor(() => { - expect(onChangeSpy).toHaveBeenCalled(); + expect(onChange).toHaveBeenCalledTimes(1); + const detail = onChange.mock.calls[0][0]; + expect(detail.name).toBe("event-list"); + expect(detail.value).toEqual(["event-option1"]); + expect(detail.event).toBeInstanceOf(Event); }); - - // Verify the callback was called with correct structure - const lastCall = onChangeSpy.mock.calls[onChangeSpy.mock.calls.length - 1]; - expect(lastCall).toBeDefined(); - expect(lastCall[0]).toHaveProperty("name", "test-list"); - expect(lastCall[0]).toHaveProperty("value"); - expect(Array.isArray(lastCall[0].value)).toBe(true); }); }); diff --git a/libs/react-components/specs/checkbox.browser.spec.tsx b/libs/react-components/specs/checkbox.browser.spec.tsx index 72d7e3fc0a..e88507d563 100644 --- a/libs/react-components/specs/checkbox.browser.spec.tsx +++ b/libs/react-components/specs/checkbox.browser.spec.tsx @@ -2,6 +2,7 @@ import { render } from "vitest-browser-react"; import { GoabCheckbox } from "../src"; import { expect, describe, it, vi } from "vitest"; import { useState } from "react"; +import { userEvent } from "@vitest/browser/context"; describe("Checkbox", () => { it("should handle _change fired inside reveal slot without affecting parent checkbox value", async () => { @@ -84,4 +85,78 @@ describe("Checkbox", () => { expect(childValue.element().textContent).toBe("false"); }); }); + + it("should have a 44px x 44px touch target area", async () => { + const result = render( + , + ); + + const checkbox = result.getByTestId("test-checkbox"); + await vi.waitFor(() => { + expect(checkbox.element()).toBeTruthy(); + }); + + const container = checkbox.element().querySelector(".container") as HTMLElement; + expect(container).toBeTruthy(); + + // Get computed styles for the ::before pseudo-element (touch target) + const beforeStyles = window.getComputedStyle(container, "::before"); + + // Verify the touch target dimensions + expect(beforeStyles.width).toBe("44px"); + expect(beforeStyles.height).toBe("44px"); + expect(beforeStyles.position).toBe("absolute"); + + // Verify the container itself has position: relative for proper positioning context + const containerStyles = window.getComputedStyle(container); + expect(containerStyles.position).toBe("relative"); + + // Verify the actual visual size of the container (24px) vs touch target (44px) + const containerRect = container.getBoundingClientRect(); + expect(containerRect.width).toBe(24); // Visual checkbox is 24px + expect(containerRect.height).toBe(24); // Visual checkbox is 24px + + // Verify the transform is applied correctly for centering + // CSS: transform: translate(-50%, -50%) converts to matrix(a, b, c, d, tx, ty) + // a,b,c,d: 2x2 transformation identity matrix + expect(beforeStyles.transform).toBe("matrix(1, 0, 0, 1, -22, -22)"); + + // Final verification: Check that all styles are applied and rendered + // After the page is fully loaded and all CSS is computed + await vi.waitFor(() => { + const finalContainerStyles = window.getComputedStyle(container); + const finalBeforeStyles = window.getComputedStyle(container, "::before"); + + // Verify final computed styles match expectations + expect(finalContainerStyles.position).toBe("relative"); + expect(finalBeforeStyles.width).toBe("44px"); + expect(finalBeforeStyles.height).toBe("44px"); + }); + }); + + it("passes the browser event in change detail", async () => { + const handleChange = vi.fn(); + const result = render( + , + ); + + const checkbox = result.getByTestId("event-checkbox"); + + await userEvent.click(checkbox); + + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledTimes(1); + const detail = handleChange.mock.calls[0][0]; + expect(detail.name).toBe("event"); + expect(detail.value).toBe("event-checkbox"); + expect(detail.checked).toBe(true); + expect(detail.event).toBeInstanceOf(Event); + }); + }); }); diff --git a/libs/react-components/specs/datagrid.browser.spec.tsx b/libs/react-components/specs/datagrid.browser.spec.tsx new file mode 100644 index 0000000000..805ecf4e5f --- /dev/null +++ b/libs/react-components/specs/datagrid.browser.spec.tsx @@ -0,0 +1,784 @@ +import { render } from "vitest-browser-react"; +import { expect, describe, it, vi } from "vitest"; +import { userEvent } from "@vitest/browser/context"; +import { useState } from "react"; +import { + GoabBadge, + GoabBlock, + GoabButton, + GoabCheckbox, + GoabContainer, + GoabDataGrid, + GoabDropdown, + GoabDropdownItem, + GoabTable, + GoabTableSortHeader, +} from "../src"; + +describe("DataGrid", () => { + type User = { + idNumber: string; + nameOfChild?: string; + dataStarted: string; + dateSubmitted: string; + status: string; + updated?: string; + email?: string; + program?: string; + programId?: string; + serviceAccess?: string; + approver?: string; + }; + + const testUsers: User[] = [ + { + idNumber: "1", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "Removed", + }, + { + idNumber: "2", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "To be removed", + }, + ]; + + const testUsersWithContainer: User[] = [ + { + idNumber: "1", + nameOfChild: "Mike Zwei", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "Removed", + updated: "Jun 30, 2022 at 2:30 PM", + email: "mike.zwei@gmail.com", + program: "Wee Wild Ones Curry", + programId: "74528567", + serviceAccess: "Claims Adjustments", + approver: "Sarah Ellis", + }, + { + idNumber: "2", + nameOfChild: "Emma Stroman", + dataStarted: "Feb 21, 2023", + dateSubmitted: "Feb 25, 2023", + status: "To be removed", + updated: "Nov 28, 2021 at 1:30 PM", + email: "emma.stroman@gmail.com", + program: "Fort McMurray", + programId: "74522643", + serviceAccess: "Claims Adjustments", + approver: "Sarah Ellis", + }, + ]; + + const getStatusBadgeType = (status: string): "success" | "emergency" | "information" | "important" => { + switch (status) { + case "Removed": + return "success"; + case "To be removed": + return "emergency"; + default: + return "information"; + } + }; + + const TestDataGrid = ({ onOpen = vi.fn(), initialUsers = testUsers }: { onOpen?: (userId: string) => void, initialUsers?: User[] }) => { + const [users, setUsers] = useState(initialUsers); + const [selectedUsers, setSelectedUsers] = useState([]); + const [isSelectedAll, setIsSelectedAll] = useState(false); + + const handleDelete = (userId: string) => { + // Actually remove the user from the array to test DOM changes + const updatedUsers = users.filter(user => user.idNumber !== userId); + setUsers(updatedUsers); + }; + + const handleSort = (event: any) => { + const { sortBy, sortDir } = event; + const sortedUsers = [...users].sort((a: any, b: any) => (a[sortBy] > b[sortBy] ? 1 : -1) * sortDir); + setUsers(sortedUsers); + }; + + const isSelected = (userId: string): boolean => { + return selectedUsers.includes(userId); + }; + + const toggleSelection = (userId: string) => { + if (selectedUsers.includes(userId)) { + setSelectedUsers(selectedUsers.filter(id => id !== userId)); + } else { + setSelectedUsers([...selectedUsers, userId]); + } + }; + + return ( +
+ + + + + + + + + ID Number + + + Date Started + + + Date Submitted + + + Status + + Actions + + + + {users.map((user) => ( + + + toggleSelection(user.idNumber)} + /> + + {user.idNumber} + {user.dataStarted} + {user.dateSubmitted} + + + + + handleDelete(user.idNumber)} + testId={`delete-${user.idNumber}`} + > + Delete + + onOpen(user.idNumber)} + testId={`open-${user.idNumber}`} + > + Open + + + + ))} + + + +
+ ); + }; + + const TestDataGridWithContainer = ({ initialUsers = testUsersWithContainer }: { initialUsers?: User[] }) => { + const [users, setUsers] = useState(initialUsers); + const [selectedUsers, setSelectedUsers] = useState([]); + const [openMessage, setOpenMessage] = useState(""); + + const isSelected = (userId: string): boolean => { + return selectedUsers.includes(userId); + }; + + const toggleSelection = (userId: string) => { + if (selectedUsers.includes(userId)) { + setSelectedUsers(selectedUsers.filter(id => id !== userId)); + } else { + setSelectedUsers([...selectedUsers, userId]); + } + }; + + const onOpen = (userId: string) => { + setOpenMessage(`Open user ${userId}`); + }; + + const onApproverChange = (userId: string, event: any) => { + const user = users.find((u) => u.idNumber === userId); + if (user) { + user.approver = event.value; + setUsers([...users]); + } + }; + + return ( +
+ {openMessage &&
{openMessage}
} + + {users.map((user) => ( + + + toggleSelection(user.idNumber)} + /> + + + + {user.nameOfChild} + + + + + + + + + Updated + {user.updated} + + + Program ID + {user.programId} + + + + + + Email + {user.email} + + + Service access + {user.serviceAccess} + + + + + + Program + {user.program} + + + Approver +
{user.approver}
+ onApproverChange(user.idNumber, event)} + > + + + + +
+
+
+
+ + onOpen(user.idNumber)}> + Open + +
+
+ ))} +
+
+ ); + }; + + describe("Keyboard Navigation", () => { + it("Using with Table - should navigate with arrow keys and show yellow border on focused cells", async () => { + const result = render(); + + // Wait for components to fully render + await new Promise(resolve => setTimeout(resolve, 500)); + + // Wait for initial grid setup + // 6 header cells + 6 cells per row * 2 rows = 18 total + await vi.waitFor(() => { + const allGridCells = result.container.querySelectorAll('[role="gridcell"]'); + expect(allGridCells.length).toBe(18); + }); + + // Focus on the first gridcell in header row (select all checkbox) + const selectAllCheckbox = result.container.querySelector('thead [role="gridcell"]') as HTMLElement; + expect(selectAllCheckbox).toBeTruthy(); + await userEvent.click(selectAllCheckbox); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press key "Arrow Right" + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Arrow Down + await userEvent.keyboard("{ArrowDown}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify td data-testid="cell-1-idNumber" has style outline:3px solid var(--goa-color-interactive-focus) + const cell1IdNumber = result.container.querySelector('[data-testid="cell-1-idNumber"]') as HTMLElement; + expect(cell1IdNumber).toBeTruthy(); + expect(cell1IdNumber.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Press Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify td data-testid="cell-1-dateStarted" has style outline:3px solid var(--goa-color-interactive-focus) + const cell1DateStarted = result.container.querySelector('[data-testid="cell-1-dateStarted"]') as HTMLElement; + expect(cell1DateStarted?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // verify td data-testid="cell-1-idNumber" has no more style defined on line 129 (no focus) + expect(cell1IdNumber?.style.outline).toBe(''); + + // Press Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify td data-testid="cell-1-dateSubmitted" has inline style outline 3px... + const cell1DateSubmitted = result.container.querySelector('[data-testid="cell-1-dateSubmitted"]') as HTMLElement; + expect(cell1DateSubmitted?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Press Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify td data-testid="cell-1-status" has inline style outline + const cell1Status = result.container.querySelector('[data-testid="cell-1-status"]') as HTMLElement; + expect(cell1Status?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Press Arrow Right to move to Actions column (last cell with buttons) + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if it's the Delete button by text content + expect(document.activeElement?.tagName).toBe('GOA-BUTTON'); + expect(document.activeElement?.textContent?.trim()).toContain('Delete'); + + // Press Arrow Right to move to Open button (second button in same cell) + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify Open button is focused + expect(document.activeElement?.tagName).toBe('GOA-BUTTON'); + expect(document.activeElement?.textContent?.trim()).toContain('Open'); + + // Test table mode boundary - Arrow Right at last cell should stay in same position + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Should still be on Open button (last focusable element in row) + expect(document.activeElement?.tagName).toBe('GOA-BUTTON'); + expect(document.activeElement?.textContent?.trim()).toContain('Open'); + + // Press Arrow Left multiple times to go back to first cell + await userEvent.keyboard("{ArrowLeft}"); // Back to Delete button + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowLeft}"); // Back to Status cell + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowLeft}"); // Back to Date Submitted + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowLeft}"); // Back to Date Started + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowLeft}"); // Back to ID Number + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowLeft}"); // Back to checkbox (first cell) + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify we're now on the checkbox (first cell) + // The checkbox is a goa-checkbox web component + expect(document.activeElement?.tagName).toBe('GOA-CHECKBOX'); + + // Test table mode boundary - Arrow Left at first cell should stay in same position + await userEvent.keyboard("{ArrowLeft}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Should still be on checkbox or first cell + expect(document.activeElement?.tagName).toBe('GOA-CHECKBOX'); + + // Verify Grid listens to Slotted content changes + // Test sorting - Press arrow up to go back to header + await userEvent.keyboard("{ArrowUp}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Enter to sort by Status column + await userEvent.keyboard("{Enter}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Enter again to sort in reverse order + await userEvent.keyboard("{Enter}"); + await new Promise(resolve => setTimeout(resolve, 200)); // Give time for sort and DOM update + + // Arrow Down to go to first data row + await userEvent.keyboard("{ArrowDown}"); + await new Promise(resolve => setTimeout(resolve, 200)); + + // After sorting, focus should be on the first cell of first row (checkbox) + expect(document.activeElement?.tagName).toBe('GOA-CHECKBOX'); + + // Navigate to the status column to verify sorting worked + // Press Arrow Right 4 times to get to status column (checkbox -> id -> dateStarted -> dateSubmitted -> status) + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Now we should be on a status cell - verify one is focused + const statusCells = result.container.querySelectorAll('td[data-testid*="-status"]'); + let focusedStatusCell: HTMLElement | null = null; + + statusCells.forEach(cell => { + const htmlCell = cell as HTMLElement; + if (htmlCell.style.outline?.includes('3px solid')) { + focusedStatusCell = htmlCell; + } + }); + + expect(focusedStatusCell).toBeTruthy(); + expect(focusedStatusCell?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Press arrow right to move to Actions column + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Enter to delete the current row + const rowCountBefore = result.container.querySelectorAll('tbody tr').length; + await userEvent.keyboard("{Enter}"); + await new Promise(resolve => setTimeout(resolve, 200)); // Give time for deletion and DOM update + + // Verify one row is removed from DOM + const rowCountAfter = result.container.querySelectorAll('tbody tr').length; + expect(rowCountAfter).toBe(rowCountBefore - 1); + + // Press Arrow Left to go back to status column + await userEvent.keyboard("{ArrowLeft}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify a status cell is still highlighted after deletion + const remainingStatusCell = result.container.querySelector('td[data-testid*="-status"]') as HTMLElement; + expect(remainingStatusCell).toBeTruthy(); + expect(remainingStatusCell?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + }); + + it("Using with Container - should navigate with arrow keys", async() => { + // TestDataGridWithContainer render + const result = render(); + + // Wait for components to fully render + await new Promise(resolve => setTimeout(resolve, 500)); + // Click on setTimeout(resolve, 100)); + + // Verify that it is highlighted style: outline: 3px... + expect(cell1?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + // Press Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify goa-block data-grid="cell-2" highlighted + const cell2 = result.container.querySelector('[data-grid="cell-2"]') as HTMLElement; + expect(cell2?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // verify that data-grid="cell-1" no more highlighted + expect(cell1?.style.outline).toBe(''); + // Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Enter + await userEvent.keyboard("{Enter}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // We will have a
{{message}}
which will update message when we press Open button => "Open user 1" for example + // Verify the message to test if Open is triggered + const openMessage = result.container.querySelector('[data-testid="open-user"]') as HTMLElement; + expect(openMessage?.textContent).toBe("Open user 1"); + // Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify data-grid="cell-4" highlighted + const cell4 = result.container.querySelector('[data-grid="cell-4"]') as HTMLElement; + expect(cell4?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify data-grid="cell-5" highlighted + const cell5 = result.container.querySelector('[data-grid="cell-5"]') as HTMLElement; + expect(cell5?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify data-grid="cell-6" highlighted + const cell6 = result.container.querySelector('[data-grid="cell-6"]') as HTMLElement; + expect(cell6?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify data-grid="cell-7" highlighted + const cell7 = result.container.querySelector('[data-grid="cell-7"]') as HTMLElement; + expect(cell7?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Arrow Right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify data-grid="cell-8" highlighted + const cell8 = result.container.querySelector('[data-grid="cell-8"]') as HTMLElement; + expect(cell8?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + // Arrow right + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Enter + await userEvent.keyboard("{Enter}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Arrow Down + await userEvent.keyboard("{ArrowDown}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Enter + await userEvent.keyboard("{Enter}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify div data-testid="approver-1" has text content = John Doe + const approver1 = result.container.querySelector('[data-testid="approver-1"]') as HTMLElement; + expect(approver1?.textContent).toBe("John Doe"); + }) + + it("Using with Container (Layout mode) - arrow right from last cell wraps to next row", async () => { + // TestDataGridWithContainer render with layout mode + const result = render(); + + // Wait for components to fully render + await new Promise(resolve => setTimeout(resolve, 500)); + + // Navigate to the approver cell (cell-9) of the first row by starting from the checkbox + // Click on the first checkbox to establish initial focus + const firstRowCheckbox = result.container.querySelectorAll('[data-grid="cell-0"]')[0] as HTMLElement; + await userEvent.click(firstRowCheckbox); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Navigate right through all cells to reach cell-9 (approver) + // From cell-0 to cell-1 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-1 to cell-2 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-2 to cell-3 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-3 to cell-4 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-4 to cell-5 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-5 to cell-6 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-6 to cell-7 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-7 to cell-8 + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // From cell-8 to cell-9 (approver) + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if the dropdown inside cell-9 is focused (it contains focusable elements) + const activeElement = document.activeElement; + + // The dropdown should be focused since cell-9 contains a focusable dropdown + expect(activeElement?.tagName).toBe('GOA-DROPDOWN'); + + // Press Arrow Right - in layout mode, this should wrap to the next row's first cell (checkbox) + await userEvent.keyboard("{ArrowRight}"); + await new Promise(resolve => setTimeout(resolve, 300)); + + // Check that a checkbox is now focused (should be the second row's checkbox) + const newActiveElement = document.activeElement; + expect(newActiveElement?.tagName).toBe('GOA-CHECKBOX'); + }); + + it("Using with Container (Layout mode) - dynamically added rows should be keyboard navigable", async () => { + // Test component that supports dynamic row addition + const TestDataGridWithDynamicRows = () => { + const [users, setUsers] = useState(testUsersWithContainer); + const [selectedUsers, setSelectedUsers] = useState([]); + const [nextUserId, setNextUserId] = useState(3); + + const isSelected = (userId: string): boolean => { + return selectedUsers.includes(userId); + }; + + const toggleSelection = (userId: string) => { + if (selectedUsers.includes(userId)) { + setSelectedUsers(selectedUsers.filter(id => id !== userId)); + } else { + setSelectedUsers([...selectedUsers, userId]); + } + }; + + const addNewRows = () => { + const newUsers: User[] = []; + let currentId = nextUserId; + for (let i = 0; i < 2; i++) { + newUsers.push({ + idNumber: String(currentId), + nameOfChild: `New User ${currentId}`, + dataStarted: "Dec 1, 2023", + dateSubmitted: "Dec 5, 2023", + status: "Submitted", + updated: "Dec 5, 2023 at 10:00 AM", + email: `user${currentId}@example.com`, + program: "Test Program", + programId: `9999${currentId}`, + serviceAccess: "Full Access", + approver: "Sarah Ellis", + }); + currentId++; + } + setNextUserId(currentId); + setUsers([...users, ...newUsers]); + }; + + return ( +
+ + Total rows: {users.length} + + {users.map((user) => ( + + + toggleSelection(user.idNumber)} + /> + {user.nameOfChild} + + + ))} + +
+ ); + }; + + const result = render(); + + // Wait for components to fully render + await new Promise(resolve => setTimeout(resolve, 500)); + + // Verify initial state - should have 2 rows + const initialRowCount = result.container.querySelector('[data-testid="row-count"]') as HTMLElement; + expect(initialRowCount?.textContent).toBe("Total rows: 2"); + + // Verify initial grid structure - 2 container rows + const initialRows = result.container.querySelectorAll('[data-grid="row"]'); + expect(initialRows.length).toBe(2); + + // Click on the first row's name cell to establish focus + const firstRowName = result.container.querySelector('[data-testid="name-1"]') as HTMLElement; + await userEvent.click(firstRowName); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify first row name is highlighted + expect(firstRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Navigate to the second row using Arrow Down + await userEvent.keyboard("{ArrowDown}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify second row name is highlighted + const secondRowName = result.container.querySelector('[data-testid="name-2"]') as HTMLElement; + expect(secondRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Add new rows by clicking the button + const addRowsBtn = result.container.querySelector('[data-testid="add-rows-btn"]') as HTMLElement; + await userEvent.click(addRowsBtn); + await new Promise(resolve => setTimeout(resolve, 500)); // Wait for React to re-render and slotchange event to rebuild grid + + // Verify rows were added - should now have 4 rows + const updatedRowCount = result.container.querySelector('[data-testid="row-count"]') as HTMLElement; + expect(updatedRowCount?.textContent).toBe("Total rows: 4"); + + const updatedRows = result.container.querySelectorAll('[data-grid="row"]'); + expect(updatedRows.length).toBe(4); + + // Click on first row's name to re-establish focus + await userEvent.click(firstRowName); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify first row name is highlighted after re-click + expect(firstRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Navigate down through all rows including newly added ones + // Row 1 -> Row 2 + await userEvent.keyboard("{ArrowDown}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify second row name is highlighted + expect(secondRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Row 2 -> Row 3 (newly added) + await userEvent.keyboard("{ArrowDown}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify we can reach the third row (newly added) + const thirdRowName = result.container.querySelector('[data-testid="name-3"]') as HTMLElement; + expect(thirdRowName).toBeTruthy(); + expect(thirdRowName?.textContent).toBe("New User 3"); + expect(thirdRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Row 3 -> Row 4 (newly added) + await userEvent.keyboard("{ArrowDown}"); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify we can reach the fourth row (newly added) + const fourthRowName = result.container.querySelector('[data-testid="name-4"]') as HTMLElement; + expect(fourthRowName).toBeTruthy(); + expect(fourthRowName?.textContent).toBe("New User 4"); + expect(fourthRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + // Navigate back up to verify bidirectional navigation works + await userEvent.keyboard("{ArrowUp}"); // Row 4 -> Row 3 + await new Promise(resolve => setTimeout(resolve, 100)); + expect(thirdRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + await userEvent.keyboard("{ArrowUp}"); // Row 3 -> Row 2 + await new Promise(resolve => setTimeout(resolve, 100)); + expect(secondRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + + await userEvent.keyboard("{ArrowUp}"); // Row 2 -> Row 1 + await new Promise(resolve => setTimeout(resolve, 100)); + expect(firstRowName?.style.outline).toContain('3px solid var(--goa-color-interactive-focus)'); + }); + }); + +}); diff --git a/libs/react-components/specs/datepicker.browser.spec.tsx b/libs/react-components/specs/datepicker.browser.spec.tsx index ce8a7a531c..2615e0d5be 100644 --- a/libs/react-components/specs/datepicker.browser.spec.tsx +++ b/libs/react-components/specs/datepicker.browser.spec.tsx @@ -48,50 +48,109 @@ describe("DatePicker", () => { }); }); - it("dispatches a value on date selection", async () => { + it("passes the browser event in change detail", async () => { const handleChange = vi.fn(); const selectedDate = new Date(); + const formattedDate = format(selectedDate, "yyyy-MM-dd"); const Component = () => { - return ; + return ( + + ); }; const result = render(); const input = result.getByTestId("calendar-input"); - const dateToSelect = result.getByTestId(format(selectedDate, "yyyy-MM-dd")); + const dateToSelect = result.getByTestId(formattedDate); + + await userEvent.click(input); - await input.click(); - await dateToSelect.click(); + await vi.waitFor(async () => { + const dateEl = dateToSelect.element() as HTMLElement; + expect(dateEl).toBeTruthy(); + await userEvent.click(dateEl); + }); await vi.waitFor(() => { - expect(handleChange).toHaveBeenCalled(); + expect(handleChange).toHaveBeenCalledTimes(1); + const detail = handleChange.mock.calls[0][0]; + expect(detail.name).toBe("event-date"); + expect(detail.valueStr).toBe(formattedDate); + expect(detail.event).toBeInstanceOf(Event); }); }); describe("DatePicker Keyboard Navigation", () => { [ - { desc: "previous day", key: "{ArrowLeft}", diff: { fn: addDays, value: -1 } }, - { desc: "next day", key: "{ArrowRight}", diff: { fn: addDays, value: 1 } }, - { desc: "previous week", key: "{ArrowUp}", diff: { fn: addDays, value: -7 } }, - { desc: "next week", key: "{ArrowDown}", diff: { fn: addDays, value: 7 } }, - { desc: "previous month", key: "{PageUp}", diff: { fn: addMonths, value: -1 } }, - { desc: "next month", key: "{PageDown}", diff: { fn: addMonths, value: 1 } }, - { desc: "previous year", key: "{Shift>}{PageUp}", diff: { fn: addYears, value: -1 } }, - { desc: "next year", key: "{Shift>}{PageDown}", diff: { fn: addYears, value: 1 } }, - ].forEach(({ desc, key, diff }) => { + { + value: "2025-03-01", + expected: "2025-02-28", + formatted: "February 28, 2025", + desc: "previous day", + key: "{ArrowLeft}", + }, + { + value: "2025-03-01", + expected: "2025-03-02", + formatted: "March 2, 2025", + desc: "next day", + key: "{ArrowRight}", + }, + { + value: "2025-03-01", + expected: "2025-02-22", + formatted: "February 22, 2025", + desc: "previous week", + key: "{ArrowUp}", + }, + { + value: "2025-03-01", + expected: "2025-03-08", + formatted: "March 8, 2025", + desc: "next week", + key: "{ArrowDown}", + }, + { + value: "2025-03-01", + expected: "2025-02-01", + formatted: "February 1, 2025", + desc: "previous month", + key: "{PageUp}", + }, + { + value: "2025-03-01", + expected: "2025-04-01", + formatted: "April 1, 2025", + desc: "next month", + key: "{PageDown}", + }, + { + value: "2025-03-01", + expected: "2024-03-01", + formatted: "March 1, 2024", + desc: "previous year", + key: "{Shift>}{PageUp}", + }, + { + value: "2025-03-01", + expected: "2026-03-01", + formatted: "March 1, 2026", + desc: "next year", + key: "{Shift>}{PageDown}", + }, + ].forEach(({ value, expected, formatted, desc, key }) => { it(`navigates to the ${desc} when ${key} is pressed`, async () => { - const inputDate = new Date(); - const currentDate = new Date( - inputDate.getFullYear(), - inputDate.getMonth(), - inputDate.getDate() - ); - const handleChange = vi.fn(); const Component = () => { - return { - handleChange(detail.value) - }} />; + return ( + { + handleChange(detail.valueStr); + }} + /> + ); }; const result = render(); @@ -99,15 +158,13 @@ describe("DatePicker", () => { await userEvent.type(input, key); - const expectedDate = diff.fn(currentDate, diff.value); await vi.waitFor(() => { const inputEl = input.element() as HTMLInputElement; - const newValue = format(expectedDate, "MMMM d, yyyy"); - expect(inputEl.value).toBe(newValue); - expect(handleChange).toBeCalledWith(expectedDate) + expect(inputEl.value).toBe(formatted); + expect(handleChange).toBeCalledWith(expected); }); - }) - }) + }); + }); }); it("renders with disabled prop", async () => { @@ -132,7 +189,9 @@ describe("DatePicker", () => { const handleChange = vi.fn(); const Component = () => { - return ; + return ( + + ); }; const result = render(); @@ -140,9 +199,117 @@ describe("DatePicker", () => { // verify input is disabled await vi.waitFor(() => { - const inputEl = (input.element()) as HTMLInputElement; + const inputEl = input.element() as HTMLInputElement; expect(inputEl.disabled).toBe(true); - }) + }); + }); + + describe("Width property", () => { + it("applies custom width with px units", async () => { + const Component = () => { + return ; + }; + + const result = render(); + const input = result.getByTestId("calendar-input"); + + await vi.waitFor(() => { + // Check the input element's computed style + const computedStyle = window.getComputedStyle(input.element()); + const inputWidth = parseFloat(computedStyle.width); + + // The width should be close to 400px (the underlying goa-input component handles the width) + expect(inputWidth).toBeGreaterThan(300); + expect(inputWidth).toBeLessThan(450); + }); + }); + + it("applies custom width with ch units", async () => { + const Component = () => { + return ; + }; + + const result = render(); + const input = result.getByTestId("calendar-input"); + + await vi.waitFor(() => { + // Check computed width is applied (browser converts ch to px) + const computedStyle = window.getComputedStyle(input.element()); + expect(computedStyle.width).toMatch(/^\d+(\.\d+)?px$/); + + // Should have a reasonable width for 25ch + const inputWidth = parseFloat(computedStyle.width); + expect(inputWidth).toBeGreaterThan(200); + expect(inputWidth).toBeLessThan(600); + }); + }); + + it("uses default width when not specified", async () => { + const Component = () => { + return ; + }; + + const result = render(); + const input = result.getByTestId("calendar-input"); + + await vi.waitFor(() => { + // Default width should be 16ch - check computed width + const computedStyle = window.getComputedStyle(input.element()); + const inputWidth = parseFloat(computedStyle.width); + + // 16ch should be around 150-300px depending on font + expect(inputWidth).toBeGreaterThan(100); + expect(inputWidth).toBeLessThan(400); + }); + }); + + it("supports percentage width units", async () => { + const Component = () => { + return ( +
+ +
+ ); + }; + + const result = render(); + const input = result.getByTestId("calendar-input"); + + await vi.waitFor(() => { + // Check computed width + const computedStyle = window.getComputedStyle(input.element()); + expect(computedStyle.width).toMatch(/^\d+(\.\d+)?px$/); + + // Should be a reasonable percentage of container + const inputWidth = parseFloat(computedStyle.width); + expect(inputWidth).toBeGreaterThan(50); + expect(inputWidth).toBeLessThan(800); + }); + }); + + it("maintains minimum width to ensure date display", async () => { + const Component = () => { + return ; + }; + + const result = render(); + const input = result.getByTestId("calendar-input"); + + await vi.waitFor(() => { + const inputEl = input.element() as HTMLInputElement; + + // Check that date value is displayed + expect(inputEl.value).toBeTruthy(); + expect(inputEl.value.length).toBeGreaterThan(0); + + // Check width is applied + const computedStyle = window.getComputedStyle(inputEl); + const inputWidth = parseFloat(computedStyle.width); + + // Should be wide enough to display date (20ch should be enough) + expect(inputWidth).toBeGreaterThan(150); + }); + }); }); }); @@ -162,66 +329,59 @@ describe("Date Picker input type", () => { const result = render(); const datePickerMonth = result.getByTestId("input-month"); + const datePickerMonthMarch = result.getByTestId("dropdown-item-3"); const datePickerDay = result.getByTestId("input-day"); const datePickerYear = result.getByTestId("input-year"); - expect(datePickerMonth).toBeTruthy(); - expect(datePickerDay).toBeTruthy(); - expect(datePickerYear).toBeTruthy(); - const rootElChangeHandler = vi.fn(); result.container.addEventListener("_change", (e: Event) => { const ce = e as CustomEvent; - rootElChangeHandler(ce.detail.value); + rootElChangeHandler(ce.detail.valueStr); }); // Select month - if (datePickerMonth) { - await datePickerMonth.click(); - await userEvent.keyboard("{ArrowDown}"); - await userEvent.keyboard("{Enter}"); - } + await datePickerMonth.click(); + await userEvent.keyboard("{ArrowDown}"); + await userEvent.keyboard("{Enter}"); // should be null because date is invalid await vi.waitFor(() => { - expect(rootElChangeHandler).toHaveBeenCalledWith(null); + expect(rootElChangeHandler).toHaveBeenCalledWith(""); }); rootElChangeHandler.mockClear(); // Input day - if (datePickerDay) { - await datePickerDay.click(); - await userEvent.type(datePickerDay, "1"); - } + await datePickerDay.click(); + await userEvent.type(datePickerDay, "1"); + + // Select month + await userEvent.click(datePickerMonth); + await userEvent.click(datePickerMonthMarch); // should be null because date is still invalid await vi.waitFor(() => { - expect(rootElChangeHandler).toHaveBeenCalledWith(null); + expect(rootElChangeHandler).toHaveBeenCalledWith(""); }); rootElChangeHandler.mockClear(); // Input year - if (datePickerYear) { - await datePickerYear.click(); - await userEvent.type(datePickerYear, "1999"); - } + await datePickerYear.click(); + await userEvent.type(datePickerYear, "1999"); // should not be null because date became valid await vi.waitFor(() => { - expect(rootElChangeHandler).toHaveBeenCalledWith("1999-01-01"); + expect(rootElChangeHandler).toHaveBeenCalledWith("1999-03-01"); }); rootElChangeHandler.mockClear(); // Clear day input - if (datePickerDay) { - await datePickerDay.click(); - await userEvent.keyboard("{ArrowRight}"); - await userEvent.keyboard("{Backspace}"); - } + await datePickerDay.click(); + await userEvent.keyboard("{ArrowRight}"); + await userEvent.keyboard("{Backspace}"); // should be null because date became invalid await vi.waitFor(() => { - expect(rootElChangeHandler).toHaveBeenCalledWith(null); + expect(rootElChangeHandler).toHaveBeenCalledWith(""); }); rootElChangeHandler.mockClear(); }); diff --git a/libs/react-components/specs/dropdown.browser.spec.tsx b/libs/react-components/specs/dropdown.browser.spec.tsx index 23483cf82e..cad3d90882 100644 --- a/libs/react-components/specs/dropdown.browser.spec.tsx +++ b/libs/react-components/specs/dropdown.browser.spec.tsx @@ -81,10 +81,13 @@ describe("Dropdown", () => { // Result - expect(handleChange).toBeCalledWith({ - name: "favcolor", - value: "red", - }) + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledTimes(1); + const detail = handleChange.mock.calls[0][0]; + expect(detail.name).toEqual("favcolor"); + expect(detail.value).toEqual("red"); + expect(detail.event).toBeInstanceOf(Event); + }); }); describe("Width", () => { @@ -585,4 +588,48 @@ describe("Dropdown", () => { }); }) }) + + describe("Dropdown reset", () => { + it("should reduce the number of element displayed within the dropdown", async () => { + let values: string[] = ["red", "blue", "green"] + + const Component = () => { + return ( + + {values.map((item) => + + )} + + ); + }; + + const result = render(); + const input = result.getByRole("combobox"); + const items = result.getByRole("option"); + + // Initial state + + await vi.waitFor(async () => { + const inputEl = input.element() as HTMLInputElement + inputEl.click(); + expect(items.elements().length).toBe(values.length); + items.elements().forEach((el, index) => { + expect(el.innerHTML.trim()).toBe(values[index]); + }) + }); + + // Reduce to 1 item + + values = ["blue"]; // the previous failure happened with this item, was one of the previous items + result.rerender() + + await vi.waitFor(async () => { + const inputEl = input.element() as HTMLInputElement + inputEl.click(); + const items = result.getByRole("option"); + expect(items.elements().length).toBe(1); + expect(items.element().innerHTML.trim()).toBe("blue"); + }); + }) + }) }); diff --git a/libs/react-components/specs/file-upload-input.browser.spec.tsx b/libs/react-components/specs/file-upload-input.browser.spec.tsx new file mode 100644 index 0000000000..dc124fcb98 --- /dev/null +++ b/libs/react-components/specs/file-upload-input.browser.spec.tsx @@ -0,0 +1,43 @@ +import { render } from "vitest-browser-react"; +import { GoabFileUploadInput } from "../src"; +import { expect, describe, it, vi } from "vitest"; +import React from "react"; + +describe("FileUploadInput Browser Tests", () => { + it("passes the browser event in select file detail", async () => { + const onSelectFile = vi.fn(); + const file = new File(["hello"], "test.txt", { type: "text/plain" }); + + const result = render( + , + ); + + const fileUpload = result.getByTestId("file-upload-input"); + + await vi.waitFor(() => { + expect(fileUpload.element()).toBeTruthy(); + }); + + const host = result.container.querySelector("goa-file-upload-input") as HTMLElement | null; + expect(host).toBeTruthy(); + + const selectEvent = new CustomEvent("_selectFile", { + detail: { file }, + }); + + host?.dispatchEvent(selectEvent); + + await vi.waitFor(() => { + expect(onSelectFile).toHaveBeenCalledTimes(1); + const detail = onSelectFile.mock.calls[0][0]; + expect(detail.file).toBe(file); + expect(detail.event).toBe(selectEvent); + expect(detail.event).toBeInstanceOf(Event); + }); + }); +}); diff --git a/libs/react-components/specs/input.browser.spec.tsx b/libs/react-components/specs/input.browser.spec.tsx new file mode 100644 index 0000000000..38883f2cd3 --- /dev/null +++ b/libs/react-components/specs/input.browser.spec.tsx @@ -0,0 +1,86 @@ +import { render } from "vitest-browser-react"; +import { GoabInput, GoabTabs } from "../src"; +import { expect, describe, it, vi } from "vitest"; +import { userEvent } from "@vitest/browser/context"; +import React from "react"; + +describe("Input Browser Tests", () => { + it("passes the browser event on change, keypress, focus, and blur details", async () => { + const onChange = vi.fn((detail) => detail.event.stopPropagation()); + const onKeyPress = vi.fn((detail) => detail.event.stopPropagation()); + const onFocus = vi.fn((detail) => detail.event.stopPropagation()); + const onBlur = vi.fn((detail) => detail.event.stopPropagation()); + const tabsOnChange = vi.fn(); + + const result = render( + +
+ + {}} + /> +
+
, + ); + + const input = result.getByTestId("event-input"); + const blurTarget = result.getByTestId("blur-target"); + + await vi.waitFor(() => { + expect(input.element()).toBeTruthy(); + }); + + const inputEl = input.element() as HTMLElement; + inputEl.focus(); + await userEvent.type(inputEl, "a"); + + await vi.waitFor(() => { + expect(onFocus).toHaveBeenCalledTimes(1); + const focusDetail = onFocus.mock.calls[0][0]; + expect(focusDetail.name).toBe("event-input"); + expect(focusDetail.value).toBe(""); + expect(focusDetail.event).toBeInstanceOf(Event); + + expect(onKeyPress).toHaveBeenCalledTimes(1); + const keyPressDetail = onKeyPress.mock.calls[0][0]; + expect(keyPressDetail.name).toBe("event-input"); + expect(keyPressDetail.value).toBe("a"); + expect(keyPressDetail.key).toBe("a"); + expect(keyPressDetail.event).toBeInstanceOf(Event); + + expect(onChange).toHaveBeenCalledTimes(1); + const changeDetail = onChange.mock.calls[0][0]; + expect(changeDetail.name).toBe("event-input"); + expect(changeDetail.value).toBe("a"); + expect(changeDetail.event).toBeInstanceOf(Event); + }); + + await vi.waitFor(() => { + const blurEl = blurTarget.element() as HTMLElement; + expect(blurEl).toBeTruthy(); + blurEl.focus(); + }); + + await vi.waitFor(() => { + expect(onBlur).toHaveBeenCalledTimes(1); + const blurDetail = onBlur.mock.calls[0][0]; + expect(blurDetail.name).toBe("event-input"); + expect(blurDetail.value).toBe("a"); + expect(blurDetail.event).toBeInstanceOf(Event); + }); + + await vi.waitFor(() => { + expect(tabsOnChange).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/libs/react-components/specs/linear-progress.browser.spec.tsx b/libs/react-components/specs/linear-progress.browser.spec.tsx new file mode 100644 index 0000000000..bc257f3711 --- /dev/null +++ b/libs/react-components/specs/linear-progress.browser.spec.tsx @@ -0,0 +1,50 @@ +import { render } from "vitest-browser-react"; +import { expect, describe, it, vi } from "vitest"; + +import { GoabLinearProgress } from "../src"; + +describe("LinearProgress", () => { + it("renders with a ", async () => { + const { baseElement } = render(); + await vi.waitFor(() => { + const el = baseElement.querySelector("goa-linear-progress"); + expect(el).toBeTruthy(); + }); + }); + + it("sets the progress value correctly", async () => { + const { baseElement } = render(); + await vi.waitFor(() => { + const el = baseElement.querySelector("goa-linear-progress"); + expect( + el?.shadowRoot + ?.querySelector(".progressbar-determinate-indicator") + ?.getAttribute("style"), + ).toBe("width: 75%;"); + expect(el?.shadowRoot?.querySelector(".percentage")?.innerText).toBe("75%"); + }); + }); + + it("rounds the progress value correctly", async () => { + const { baseElement } = render(); + await vi.waitFor(() => { + const el = baseElement.querySelector("goa-linear-progress"); + expect( + el?.shadowRoot + ?.querySelector(".progressbar-determinate-indicator") + ?.getAttribute("style"), + ).toBe("width: 49%;"); + expect(el?.shadowRoot?.querySelector(".percentage")?.innerText).toBe("49%"); + }); + }); + + it("does not show percent label when showPercentage is false", async () => { + const { baseElement } = render( + , + ); + await vi.waitFor(() => { + const el = baseElement.querySelector("goa-linear-progress"); + expect(el?.shadowRoot?.querySelector("span .percentage")).toBeNull(); + }); + }); +}); diff --git a/libs/react-components/specs/menu-button.browser.spec.tsx b/libs/react-components/specs/menu-button.browser.spec.tsx index 60bd94cfcb..62746d77b9 100644 --- a/libs/react-components/specs/menu-button.browser.spec.tsx +++ b/libs/react-components/specs/menu-button.browser.spec.tsx @@ -123,4 +123,26 @@ describe("MenuButton", () => { expect(onAction.mock.calls[0][0].action).toBe("first"); expect(onAction.mock.calls[1][0].action).toBe("second"); }); + + + it("should render with leadingIcon", async () => { + const onAction = vi.fn(); + + const Component = () => { + return ( + + + + + ); + }; + + const result = render(); + + // Verify leading icon on button + await vi.waitFor(async () => { + const leadingIcon = result.getByTestId("icon-calendar"); + expect(leadingIcon).toBeDefined(); + }); + }); }); diff --git a/libs/react-components/specs/radio.browser.spec.tsx b/libs/react-components/specs/radio.browser.spec.tsx index 5d15c59caa..06e366538f 100644 --- a/libs/react-components/specs/radio.browser.spec.tsx +++ b/libs/react-components/specs/radio.browser.spec.tsx @@ -3,6 +3,7 @@ import { GoabButton, GoabRadioGroup, GoabRadioItem } from "../src"; import { expect, describe, it, vi } from "vitest"; import { useState } from "react"; import React from "react"; +import { userEvent } from "@vitest/browser/context"; describe("Radio", () => { it("should enable and disable radio group programmatically", async () => { @@ -98,4 +99,93 @@ describe("Radio", () => { expect(selectedValue.element().textContent).toBe("apple"); }); }); + + it("should have a 44px x 44px touch target area", async () => { + const result = render( + + + + ); + + const radioInput = result.getByTestId("radio-option-option1"); + await vi.waitFor(() => { + expect(radioInput.element()).toBeTruthy(); + }); + + // Get the parent label element and find the .icon element + const label = radioInput.element().closest("label"); + expect(label).toBeTruthy(); + + const icon = label?.querySelector(".icon") as HTMLElement; + expect(icon).toBeTruthy(); + + // Get computed styles for the ::before pseudo-element (touch target) + const beforeStyles = window.getComputedStyle(icon, "::before"); + + // Verify the touch target dimensions + expect(beforeStyles.width).toBe("44px"); + expect(beforeStyles.height).toBe("44px"); + expect(beforeStyles.position).toBe("absolute"); + + // Verify the icon itself has position: relative for proper positioning context + const iconStyles = window.getComputedStyle(icon); + expect(iconStyles.position).toBe("relative"); + + // Verify the actual visual size of the icon (24px) vs touch target (44px) + const iconRect = icon.getBoundingClientRect(); + expect(iconRect.width).toBe(24); // Visual icon is 24px + expect(iconRect.height).toBe(24); // Visual icon is 24px + + // Verify the transform is applied correctly for centering + // CSS: transform: translate(-50%, -50%) converts to matrix(a, b, c, d, tx, ty) + // a,b,c,d: 2x2 transformation identity matrix + expect(beforeStyles.transform).toBe("matrix(1, 0, 0, 1, -22, -22)"); + + // Check ::after pseudo-element (should not interfere with touch target) + const afterStyles = window.getComputedStyle(icon, "::after"); + // ::after should not have conflicting dimensions or positioning + expect(afterStyles.position).not.toBe("absolute"); + + // Final verification: Check that all styles are applied and rendered + // After the page is fully loaded and all CSS is computed + await vi.waitFor(() => { + const finalIconStyles = window.getComputedStyle(icon); + const finalBeforeStyles = window.getComputedStyle(icon, "::before"); + + // Verify final computed styles match expectations + expect(finalIconStyles.position).toBe("relative"); + expect(finalBeforeStyles.width).toBe("44px"); + expect(finalBeforeStyles.height).toBe("44px"); + }); + }); + + it("passes the browser event in change detail", async () => { + const handleChange = vi.fn(); + const result = render( + + + , + ); + + const radioInput = result.getByTestId("radio-option-option1"); + await vi.waitFor(() => { + expect(radioInput.element()).toBeTruthy(); + }); + + const radioEl = radioInput.element() as HTMLInputElement; + // This sets up the label to be clicked instead of the element + // I don't understand why this is necessary, but it works when the actual element doesn't + const radioLabel = radioEl.closest("label") as HTMLElement; + expect(radioLabel).toBeTruthy(); + + await userEvent.click(radioLabel); + + await vi.waitFor(() => { + expect(handleChange).toHaveBeenCalledTimes(1); + const detail = handleChange.mock.calls[0][0]; + expect(detail.name).toBe("test"); + expect(detail.value).toBe("option1"); + expect(detail.event).toBeInstanceOf(Event); + }); + }); }); diff --git a/libs/react-components/specs/tabs.browser.spec.tsx b/libs/react-components/specs/tabs.browser.spec.tsx index d401a3bdae..e687da6f73 100644 --- a/libs/react-components/specs/tabs.browser.spec.tsx +++ b/libs/react-components/specs/tabs.browser.spec.tsx @@ -62,7 +62,7 @@ describe("Tabs Browser Tests", () => { // Verify URL components are preserved await vi.waitFor(() => { - expect(window.location.search.indexOf("param=value")).toBeGreaterThan(0) + expect(window.location.search.indexOf("param=value")).toBeGreaterThan(0); // Check for both hashes in the URL expect(window.location.hash).toBe("#tab-2#anchorPoint"); expect(window.location.href).toContain("#tab-2#anchorPoint"); @@ -426,4 +426,177 @@ describe("Tabs Browser Tests", () => { }); }); }); + describe("disabled", () => { + it("should not show the disabled tab even initial tab is that tab", async () => { + // GIVEN - Tab 1 is disabled but initialTab is set to 1 + const Component = () => { + return ( + + +

Content 1 - This should NOT be visible

+
+ +

Content 2 - This SHOULD be visible on load

+
+ +

Content 3

+
+
+ ); + }; + + const { getByTestId, getByText } = render(); + + // Wait for component to fully render + await vi.waitFor(() => { + expect(getByTestId("test-tabs")).toBeTruthy(); + }); + + // THEN - Tab 1 should be disabled with correct attributes + await vi.waitFor(() => { + const tab1 = getByTestId("tab-1"); + expect(tab1.element().getAttribute("aria-disabled")).toBe("true"); + expect(tab1.element().getAttribute("aria-selected")).toBe("false"); + expect(tab1.element().getAttribute("tabindex")).toBe("-1"); + }); + + // THEN - Tab 2 should be active (since Tab 1 is disabled) + await vi.waitFor(() => { + const tab2 = getByTestId("tab-2"); + expect(tab2.element().getAttribute("aria-selected")).toBe("true"); + expect(tab2.element().getAttribute("tabindex")).toBe("0"); + // Content 2 should be visible + expect(getByText("Content 2 - This SHOULD be visible on load")).toBeTruthy(); + }); + + // WHEN - Press arrow right to move to Tab 3 + const tab2 = getByTestId("tab-2"); + tab2.element().focus(); + await tab2 + .element() + .dispatchEvent( + new KeyboardEvent("keydown", { key: "ArrowRight", bubbles: true }), + ); + + // THEN - Tab 3 should be active + await vi.waitFor(() => { + const tab3 = getByTestId("tab-3"); + expect(tab3.element().getAttribute("aria-selected")).toBe("true"); + expect(tab3.element().getAttribute("tabindex")).toBe("0"); + // Content 3 should be visible + expect(getByText("Content 3")).toBeTruthy(); + }); + + // WHEN - Press arrow right again (should skip Tab 1 and go to Tab 2) + const tab3 = getByTestId("tab-3"); + await tab3 + .element() + .dispatchEvent( + new KeyboardEvent("keydown", { key: "ArrowRight", bubbles: true }), + ); + + // THEN - Tab 2 should be active (Tab 1 is skipped because it's disabled) + await vi.waitFor(() => { + const tab2After = getByTestId("tab-2"); + expect(tab2After.element().getAttribute("aria-selected")).toBe("true"); + expect(tab2After.element().getAttribute("tabindex")).toBe("0"); + // Content 2 should be visible again + expect(getByText("Content 2 - This SHOULD be visible on load")).toBeTruthy(); + }); + }); + + it("should skip disabled tab when navigating with arrow left", async () => { + // GIVEN - Tab 2 is disabled + const Component = () => { + return ( + + +

Content 1

+
+ +

Content 2 - This should NOT be visible

+
+ +

Content 3

+
+
+ ); + }; + + const { getByTestId, getByText } = render(); + + // Wait for component to fully render + await vi.waitFor(() => { + expect(getByTestId("test-tabs")).toBeTruthy(); + }); + + // THEN - Tab 1 should be active initially + await vi.waitFor(() => { + const tab1 = getByTestId("tab-1"); + expect(tab1.element().getAttribute("aria-selected")).toBe("true"); + }); + + // Navigate to Tab 3 first (skip Tab 2 which is disabled) + const tab1 = getByTestId("tab-1"); + tab1.element().focus(); + await tab1 + .element() + .dispatchEvent( + new KeyboardEvent("keydown", { key: "ArrowRight", bubbles: true }), + ); + + // THEN - Tab 3 should be active (Tab 2 is skipped) + await vi.waitFor(() => { + const tab3 = getByTestId("tab-3"); + expect(tab3.element().getAttribute("aria-selected")).toBe("true"); + expect(getByText("Content 3")).toBeTruthy(); + }); + + // WHEN - Press arrow left (should skip Tab 2 and go to Tab 1) + const tab3 = getByTestId("tab-3"); + await tab3 + .element() + .dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowLeft", bubbles: true })); + + // THEN - Tab 1 should be active (Tab 2 is skipped) + await vi.waitFor(() => { + const tab1After = getByTestId("tab-1"); + expect(tab1After.element().getAttribute("aria-selected")).toBe("true"); + expect(getByText("Content 1")).toBeTruthy(); + }); + }); + }); + describe("variant segmented", () => { + it("should render segmented tabs", async () => { + // GIVEN - Tabs with variant="segmented" + const Component = () => { + return ( + + +

Overview content

+
+ +

Details content

+
+ +

Settings content

+
+
+ ); + }; + + const { getByTestId } = render(); + + // Wait for component to fully render + await vi.waitFor(() => { + expect(getByTestId("segment-tabs")).toBeTruthy(); + }); + + // THEN - The tablist container should have the "segmented" class + await vi.waitFor(() => { + const tabsContainer = getByTestId("segment-tabs"); + expect(tabsContainer.element().classList.contains("segmented")).toBe(true); + }); + }); + }); }); diff --git a/libs/react-components/specs/textarea.browser.spec.tsx b/libs/react-components/specs/textarea.browser.spec.tsx index fcb3df6865..5427a1f5e2 100644 --- a/libs/react-components/specs/textarea.browser.spec.tsx +++ b/libs/react-components/specs/textarea.browser.spec.tsx @@ -2,7 +2,7 @@ import { render } from "vitest-browser-react"; import { GoabInput, GoabTextArea } from "../src"; import { expect, describe, it, vi } from "vitest"; -import { useState } from "react"; +import { userEvent } from "@vitest/browser/context"; describe("TextArea Browser Tests", () => { const noop = () => { @@ -37,25 +37,24 @@ describe("TextArea Browser Tests", () => { ); }); - it("should trigger onBlur event when focus leaves the textarea", async () => { - const onBlurSpy = vi.fn(); + it("passes the browser event on change, keypress, and blur details", async () => { + const onChange = vi.fn(); + const onKeyPress = vi.fn(); + const onBlur = vi.fn(); const Component = () => { - const [value, setValue] = useState(""); - return ( -
+
setValue(detail.value)} - onBlur={onBlurSpy} + testId="test-textarea" + onChange={onChange} + onKeyPress={onKeyPress} + onBlur={onBlur} /> {}} /> @@ -64,31 +63,46 @@ describe("TextArea Browser Tests", () => { }; const result = render(); - const textareaEl = result.getByTestId("test-textarea"); - const inputEl = result.getByTestId("focus-target"); - const container = result.getByTestId("container"); + const textarea = result.getByTestId("test-textarea"); + const input = result.getByTestId("test-input"); await vi.waitFor(async () => { - const textarea = textareaEl.element() as HTMLTextAreaElement; + const textareaEL = textarea.element() as HTMLTextAreaElement; expect(textarea).toBeTruthy(); - textarea.focus(); - textarea.value = "Test content for blur"; + textareaEL.focus(); + + await userEvent.type(textareaEL, "s"); + }); + + await vi.waitFor(() => { + expect(onChange).toHaveBeenCalledTimes(1); + const changeDetail = onChange.mock.calls[0][0]; + expect(changeDetail.name).toBe("test-textarea"); + expect(changeDetail.value).toBe("s"); + expect(changeDetail.event).toBeInstanceOf(Event); + + expect(onKeyPress).toHaveBeenCalledTimes(1); + const keyPressDetail = onKeyPress.mock.calls[0][0]; + expect(keyPressDetail.name).toBe("test-textarea"); + expect(keyPressDetail.value).toBe("s"); + expect(keyPressDetail.key).toBe("s"); + expect(keyPressDetail.event).toBeInstanceOf(Event); }); // Trigger blur by focusing on the input element await vi.waitFor(() => { - const input = inputEl.element() as HTMLInputElement; - expect(input).toBeTruthy(); - input.focus(); + const inputEL = input.element() as HTMLInputElement; + expect(inputEL).toBeTruthy(); + inputEL.focus(); }); // Verify onBlur was called with correct values await vi.waitFor(() => { - expect(onBlurSpy).toHaveBeenCalledTimes(1); - expect(onBlurSpy).toHaveBeenCalledWith({ - name: "test-textarea", - value: "Test content for blur", - }); + expect(onBlur).toHaveBeenCalledTimes(1); + const blurDetail = onBlur.mock.calls[0][0]; + expect(blurDetail.name).toBe("test-textarea"); + expect(blurDetail.value).toBe("s"); + expect(blurDetail.event).toBeInstanceOf(Event); }); }); diff --git a/libs/react-components/specs/work-side-menu.browser.spec.tsx b/libs/react-components/specs/work-side-menu.browser.spec.tsx new file mode 100644 index 0000000000..640783141f --- /dev/null +++ b/libs/react-components/specs/work-side-menu.browser.spec.tsx @@ -0,0 +1,216 @@ +import { render } from "vitest-browser-react"; +import { useState } from "react"; +import { GoabButton } from "../src"; +import { GoabxWorkSideMenu, GoabxWorkSideMenuItem } from "../src/experimental"; +import { expect, describe, it, vi } from "vitest"; +import { page } from "@vitest/browser/context"; + +describe("WorkSideMenu", () => { + describe("Desktop viewport", () => { + it("renders with slots", async () => { + await page.viewport(1024, 768); + const Component = () => { + return ( + + } + secondaryContent={ + + } + accountContent={ + + } + open={true} + /> + ); + }; + const result = render(); + + await vi.waitFor(() => { + const menu = result.getByTestId("work-side-menu"); + expect(menu).toBeTruthy(); + + const primarySlot = result.baseElement.querySelector("[slot='primary']"); + const primaryMenuItem = result.getByTestId("primary-menu-item"); + const primaryLink = primaryMenuItem.element().querySelector("a"); + + expect(primarySlot).toBeTruthy(); + expect(primaryLink?.getAttribute("href")).toBe("#item1"); + expect(primaryLink?.textContent).toContain("Item 1"); + expect(primaryLink?.role).toBe("menuitem"); + + const secondarySlot = result.baseElement.querySelector("[slot='secondary']"); + const secondaryMenuItem = result.getByTestId("secondary-menu-item"); + const secondaryLink = secondaryMenuItem.element().querySelector("a"); + + expect(secondarySlot).toBeTruthy(); + expect(secondaryLink?.getAttribute("href")).toBe("#item2"); + expect(secondaryLink?.textContent).toContain("Item 2"); + expect(secondaryLink?.role).toBe("menuitem"); + + const accountSlot = result.baseElement.querySelector("[slot='account']"); + const accountMenuItem = result.getByTestId("account-menu-item"); + const accountLink = accountMenuItem.element().querySelector("a"); + + expect(accountSlot).toBeTruthy(); + expect(accountLink?.getAttribute("href")).toBe("#item3"); + expect(accountLink?.textContent).toContain("Item 3"); + expect(accountLink?.role).toBe("menuitem"); + }); + }); + + it("should close and open the menu when pressing the toggle button", async () => { + const Component = () => { + return ( + } + secondaryContent={} + accountContent={} + open={true} + /> + ); + }; + const result = render(); + + expect(result.getByTestId("work-side-menu")).toBeTruthy(); + + const menu = result.getByTestId("work-side-menu"); + const toggle = result.getByTestId("toggle-menu"); + + await toggle.click(); + + expect(menu.element().classList.contains("closed")).toBeTruthy(); + + await toggle.click(); + expect(menu.element().classList.contains("closed")).toBeFalsy(); + }); + + it("selecting a menu item navigates to a new location", async () => { + const handler = vi.fn(); + window.addEventListener("_update", handler); + + const Component = () => { + return ( + + } + secondaryContent={} + accountContent={} + open={true} + /> + ); + }; + const result = render(); + expect(result.getByTestId("work-side-menu")).toBeTruthy(); + + const item1 = result.getByTestId("menu-item-1"); + + await item1.click(); + await vi.waitFor(() => { + expect(window.location.hash).toBe("#item1"); + }); + }); + }); + + describe("Mobile viewport", () => { + it("should close the menu when selecting the background", async () => { + await page.viewport(390, 844); + const Component = () => { + return ( + } + secondaryContent={} + accountContent={} + open={true} + /> + ); + }; + const result = render(); + + expect(result.getByTestId("work-side-menu")).toBeTruthy(); + + const menu = result.getByTestId("work-side-menu"); + const background = result.getByTestId("work-side-menu-background"); + + await background.click({ position: { x: 380, y: 10 } }); + await vi.waitFor(() => { + expect(menu.element().classList.contains("closed")).toBeTruthy(); + }); + }); + + it("should open the menu when clicking an external button", async () => { + const Component = () => { + const [open, setOpen] = useState(false); + function onClick() { + setOpen(!open); + } + + function menuOnToggle() { + setOpen(!open); + } + return ( + <> + } + secondaryContent={} + accountContent={} + open={open} + onToggle={menuOnToggle} + /> + Toggle menu + + ); + }; + const result = render(); + + expect(result.getByTestId("work-side-menu")).toBeTruthy(); + + const menu = result.getByTestId("work-side-menu"); + const button = result.getByText("Toggle menu"); + + await button.click(); + await vi.waitFor(() => { + expect(menu.element().classList.contains("closed")).toBeFalsy(); + }); + }); + }); +}); diff --git a/libs/react-components/src/experimental/index.ts b/libs/react-components/src/experimental/index.ts index f985935ece..cf6c65f95b 100644 --- a/libs/react-components/src/experimental/index.ts +++ b/libs/react-components/src/experimental/index.ts @@ -1,2 +1,4 @@ export * from "./resizable-panel/ResizablePanel"; export * from "../lib/drawer/drawer"; +export * from "./work-side-menu/work-side-menu"; +export * from "./work-side-menu-item/work-side-menu-item"; diff --git a/libs/react-components/src/experimental/work-side-menu-item/work-side-menu-item.spec.tsx b/libs/react-components/src/experimental/work-side-menu-item/work-side-menu-item.spec.tsx new file mode 100644 index 0000000000..85983989f1 --- /dev/null +++ b/libs/react-components/src/experimental/work-side-menu-item/work-side-menu-item.spec.tsx @@ -0,0 +1,26 @@ +import { render } from "@testing-library/react"; + +import WorkSideMenuItem from "./work-side-menu-item"; + +describe("WorkSideMenuItem", () => { + it("should render successfully", () => { + const { baseElement } = render( + + ); + expect(baseElement).toBeTruthy(); + const menuItem = baseElement.querySelector("goa-work-side-menu-item"); + expect(menuItem?.getAttribute("label")).toBe("Foo"); + expect(menuItem?.getAttribute("url")).toBe("#"); + expect(menuItem?.getAttribute("badge")).toBe("42"); + expect(menuItem?.getAttribute("icon")).toBe("star"); + expect(menuItem?.getAttribute("testid")).toBe("foo"); + expect(menuItem?.getAttribute("type")).toBe("success"); + }); +}); diff --git a/libs/react-components/src/experimental/work-side-menu-item/work-side-menu-item.tsx b/libs/react-components/src/experimental/work-side-menu-item/work-side-menu-item.tsx new file mode 100644 index 0000000000..b0bc5545c4 --- /dev/null +++ b/libs/react-components/src/experimental/work-side-menu-item/work-side-menu-item.tsx @@ -0,0 +1,52 @@ +import { type JSX } from "react"; +import { GoabWorkSideMenuItemType } from "@abgov/ui-components-common"; +interface WCProps { + label: string; + url: string; + badge?: string; + current?: string; + divider?: string; + icon?: string; + testid?: string; + type?: GoabWorkSideMenuItemType; +} + +declare module "react" { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace JSX { + interface IntrinsicElements { + "goa-work-side-menu-item": WCProps & React.HTMLAttributes; + } + } +} + +export interface GoabWorkSideMenuItemProps { + label: string; + url: string; + badge?: string; + current?: boolean; + divider?: boolean; + icon?: string; + testId?: string; + type?: GoabWorkSideMenuItemType; + children?: React.ReactNode; +} + +export function GoabxWorkSideMenuItem(props: GoabWorkSideMenuItemProps): JSX.Element { + return ( + + {props.children} + + ); +} + +export default GoabxWorkSideMenuItem; diff --git a/libs/react-components/src/experimental/work-side-menu/work-side-menu.spec.tsx b/libs/react-components/src/experimental/work-side-menu/work-side-menu.spec.tsx new file mode 100644 index 0000000000..1a2a603432 --- /dev/null +++ b/libs/react-components/src/experimental/work-side-menu/work-side-menu.spec.tsx @@ -0,0 +1,24 @@ +import { render } from "@testing-library/react"; + +import WorkSideMenu from "./work-side-menu"; + +describe("WorkSideMenu", () => { + it("should render successfully", () => { + const { baseElement } = render( + , + ); + expect(baseElement).toBeTruthy(); + const menu = baseElement.querySelector("goa-work-side-menu"); + expect(menu?.getAttribute("heading")).toBe("foo"); + expect(menu?.getAttribute("url")).toBe("#"); + expect(menu?.getAttribute("user-name")).toBe("Test User"); + expect(menu?.getAttribute("user-secondary-text")).toBe("test.user@example.com"); + expect(menu?.getAttribute("testid")).toBe("bar"); + }); +}); \ No newline at end of file diff --git a/libs/react-components/src/experimental/work-side-menu/work-side-menu.tsx b/libs/react-components/src/experimental/work-side-menu/work-side-menu.tsx new file mode 100644 index 0000000000..f3b249c115 --- /dev/null +++ b/libs/react-components/src/experimental/work-side-menu/work-side-menu.tsx @@ -0,0 +1,78 @@ +import { ReactNode, useEffect, useRef, type JSX } from "react"; + +interface WCProps { + heading: string; + url: string; + "user-name"?: string; + "user-secondary-text"?: string; + testid?: string; + primaryContent?: ReactNode; + secondaryContent?: ReactNode; + accountContent?: ReactNode; + open?: boolean; + ref: React.RefObject; +} +declare module "react" { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace JSX { + interface IntrinsicElements { + "goa-work-side-menu": WCProps & React.HTMLAttributes; + } + } +} + +/* eslint-disable-next-line */ +export interface GoabWorkSideMenuProps { + heading: string; + url: string; + userName?: string; + userSecondaryText?: string; + testId?: string; + primaryContent?: ReactNode; + secondaryContent?: ReactNode; + accountContent?: ReactNode; + open?: boolean; + onToggle?: () => void; +} + +export function GoabxWorkSideMenu({ + heading, + url, + userName, + userSecondaryText, + testId, + primaryContent, + secondaryContent, + accountContent, + open, + onToggle, +}: GoabWorkSideMenuProps): JSX.Element { + const el = useRef(null); + + useEffect(() => { + if (!el?.current || !onToggle) { + return; + } + el.current?.addEventListener("_toggle", onToggle); + return () => { + el.current?.removeEventListener("_toggle", onToggle); + }; + }, [el, onToggle]); + return ( + + {primaryContent &&
{primaryContent}
} + {secondaryContent &&
{secondaryContent}
} + {accountContent &&
{accountContent}
} +
+ ); +} + +export default GoabxWorkSideMenu; diff --git a/libs/react-components/src/index.ts b/libs/react-components/src/index.ts index 14bf77bb21..693d58c97d 100644 --- a/libs/react-components/src/index.ts +++ b/libs/react-components/src/index.ts @@ -13,6 +13,7 @@ export * from "./lib/checkbox-list/checkbox-list"; export * from "./lib/chip/chip"; export * from "./lib/circular-progress/circular-progress"; export * from "./lib/container/container"; +export * from "./lib/data-grid/data-grid"; export * from "./lib/date-picker/date-picker"; export * from "./lib/details/details"; export * from "./lib/divider/divider"; @@ -41,6 +42,7 @@ export * from "./lib/hero-banner/hero-banner-actions"; export * from "./lib/icon-button/icon-button"; export * from "./lib/icon/icon"; export * from "./lib/input/input"; +export * from "./lib/linear-progress/linear-progress"; export * from "./lib/link/link"; export * from "./lib/link-button/link-button"; export * from "./lib/menu-button/menu-button"; diff --git a/libs/react-components/src/lib/accordion/accordion.spec.tsx b/libs/react-components/src/lib/accordion/accordion.spec.tsx index 829b3f3332..2331e6bfe2 100644 --- a/libs/react-components/src/lib/accordion/accordion.spec.tsx +++ b/libs/react-components/src/lib/accordion/accordion.spec.tsx @@ -34,4 +34,17 @@ describe("Accordion", () => { expect(badge?.getAttribute("content")).toBe("test-badge"); expect(el?.getAttribute("maxwidth")).toBe("480px"); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Content + , + ); + const el = baseElement.querySelector("goa-accordion"); + expect(el?.getAttribute("data-grid")).toBe("row"); + }); }); diff --git a/libs/react-components/src/lib/accordion/accordion.tsx b/libs/react-components/src/lib/accordion/accordion.tsx index 5d020aba5c..094871ac28 100644 --- a/libs/react-components/src/lib/accordion/accordion.tsx +++ b/libs/react-components/src/lib/accordion/accordion.tsx @@ -3,11 +3,11 @@ import { ReactNode, useEffect, useRef, type JSX } from "react"; import type { GoabAccordionHeadingSize, GoabAccordionIconPosition, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.RefObject; open?: string; headingsize?: GoabAccordionHeadingSize; heading: string; @@ -22,12 +22,15 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-accordion": WCProps & React.HTMLAttributes; + "goa-accordion": WCProps & + React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabAccordionProps extends Margins { +export interface GoabAccordionProps extends Margins, DataAttributes { open?: boolean; headingSize?: GoabAccordionHeadingSize; secondaryText?: string; @@ -42,28 +45,21 @@ export interface GoabAccordionProps extends Margins { export function GoabAccordion({ open, - heading, - headingSize, - secondaryText, - headingContent, - iconPosition, - maxWidth, - testId, onChange, + headingContent, children, - mt, - mr, - mb, - ml, + ...rest }: GoabAccordionProps): JSX.Element { const ref = useRef(null); + const _props = transformProps(rest, lowercase); + useEffect(() => { const element = ref.current; if (element && onChange) { const handler = (event: Event) => { const customEvent = event as CustomEvent; - onChange(customEvent.detail.open); + onChange?.(customEvent.detail.open); }; element.addEventListener("_change", handler); return () => { @@ -71,20 +67,12 @@ export function GoabAccordion({ }; } }, [onChange]); + return ( {headingContent &&
{headingContent}
} {children} diff --git a/libs/react-components/src/lib/app-header-menu/app-header-menu.spec.tsx b/libs/react-components/src/lib/app-header-menu/app-header-menu.spec.tsx index e6f938c23f..c50adace64 100644 --- a/libs/react-components/src/lib/app-header-menu/app-header-menu.spec.tsx +++ b/libs/react-components/src/lib/app-header-menu/app-header-menu.spec.tsx @@ -35,4 +35,17 @@ describe("AppHeaderMenu", () => { expect(el?.getAttribute("leadingIcon")).toBe("search"); expect(el?.getAttribute("testid")).toBe("foo"); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Content + , + ); + const el = baseElement.querySelector("goa-app-header-menu"); + expect(el?.getAttribute("data-grid")).toBe("row"); + }); }); diff --git a/libs/react-components/src/lib/app-header-menu/app-header-menu.tsx b/libs/react-components/src/lib/app-header-menu/app-header-menu.tsx index f780c631b6..9c123c57f7 100644 --- a/libs/react-components/src/lib/app-header-menu/app-header-menu.tsx +++ b/libs/react-components/src/lib/app-header-menu/app-header-menu.tsx @@ -1,5 +1,6 @@ import { ReactNode } from "react"; -import { GoabIconType } from "@abgov/ui-components-common"; +import { DataAttributes, GoabIconType } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { heading: string; @@ -8,7 +9,7 @@ interface WCProps { } /* eslint-disable-next-line */ -export interface GoabAppHeaderMenuProps { +export interface GoabAppHeaderMenuProps extends DataAttributes { heading: string; leadingIcon?: GoabIconType; testId?: string; @@ -24,14 +25,15 @@ declare module "react" { } } -export function GoabAppHeaderMenu(props: GoabAppHeaderMenuProps) { +export function GoabAppHeaderMenu({ + children, + ...rest +}: GoabAppHeaderMenuProps) { + const _props = transformProps(rest, lowercase); + return ( - - {props.children} + + {children} ); } diff --git a/libs/react-components/src/lib/app-header/app-header.spec.tsx b/libs/react-components/src/lib/app-header/app-header.spec.tsx index 58e0afd5c3..dc16baae16 100644 --- a/libs/react-components/src/lib/app-header/app-header.spec.tsx +++ b/libs/react-components/src/lib/app-header/app-header.spec.tsx @@ -22,4 +22,16 @@ describe("GoabAppHeader", () => { header?.dispatchEvent(new Event("_menuClick")); expect(onMobileMenuClick).toHaveBeenCalled(); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + , + ); + const el = baseElement.querySelector("goa-app-header"); + expect(el?.getAttribute("data-grid")).toBe("row"); + }); }); diff --git a/libs/react-components/src/lib/app-header/app-header.tsx b/libs/react-components/src/lib/app-header/app-header.tsx index ab331f797a..068a26abee 100644 --- a/libs/react-components/src/lib/app-header/app-header.tsx +++ b/libs/react-components/src/lib/app-header/app-header.tsx @@ -1,4 +1,6 @@ import { useEffect, useRef, type JSX } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { heading?: string; @@ -6,7 +8,6 @@ interface WCProps { maxcontentwidth?: string; fullmenubreakpoint?: number; hasmenuclickhandler?: string; - ref: React.RefObject; testid?: string; } @@ -14,12 +15,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-app-header": WCProps & React.HTMLAttributes; + "goa-app-header": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabAppHeaderProps { +export interface GoabAppHeaderProps extends DataAttributes { heading?: string; url?: string; maxContentWidth?: string; @@ -30,16 +33,14 @@ export interface GoabAppHeaderProps { } export function GoabAppHeader({ - heading, - url, - maxContentWidth, - fullMenuBreakpoint, - testId, - children, onMenuClick, + children, + ...rest }: GoabAppHeaderProps): JSX.Element { const el = useRef(null); + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) { return; @@ -49,7 +50,7 @@ export function GoabAppHeader({ } const current = el.current; const listener = () => { - onMenuClick(); + onMenuClick?.(); }; current.addEventListener("_menuClick", listener); return () => { @@ -60,12 +61,8 @@ export function GoabAppHeader({ return ( {children} diff --git a/libs/react-components/src/lib/badge/badge.spec.tsx b/libs/react-components/src/lib/badge/badge.spec.tsx index 386447c4f8..91eea81cb9 100644 --- a/libs/react-components/src/lib/badge/badge.spec.tsx +++ b/libs/react-components/src/lib/badge/badge.spec.tsx @@ -36,6 +36,18 @@ describe("GoabBadge", () => { expect(el?.getAttribute("arialabel")).toBe("text"); }); + it("should pass data-grid attributes", () => { + const { container } = render( + , + ); + const el = container.querySelector("goa-badge"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); + it("should render custom icon type when icontype is provided", () => { const { container } = render( (rest, lowercase); + return ( ); } diff --git a/libs/react-components/src/lib/block/block.spec.tsx b/libs/react-components/src/lib/block/block.spec.tsx index d8355433d8..b0f69049c1 100644 --- a/libs/react-components/src/lib/block/block.spec.tsx +++ b/libs/react-components/src/lib/block/block.spec.tsx @@ -30,4 +30,16 @@ describe("Block", () => { expect(el?.getAttribute("mb")).toBe("l"); expect(el?.getAttribute("ml")).toBe("xl"); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + Content + , + ); + const el = container.querySelector("goa-block"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/block/block.tsx b/libs/react-components/src/lib/block/block.tsx index 0a1e7abd65..70d5431d92 100644 --- a/libs/react-components/src/lib/block/block.tsx +++ b/libs/react-components/src/lib/block/block.tsx @@ -1,15 +1,19 @@ import { GoabBlockAlignment, GoabBlockDirection, - Margins, + Margins, DataAttributes, Spacing, } from "@abgov/ui-components-common"; import { ReactNode } from "react"; +import { transformProps, kebab } from "../common/extract-props"; export interface WCProps extends Margins { gap?: Spacing; direction?: GoabBlockDirection; alignment?: GoabBlockAlignment; + "min-width"?: string; + "max-width"?: string; + width?: string; testid?: string; } @@ -23,27 +27,30 @@ declare module "react" { } /* eslint-disable-next-line */ -export interface GoabBlockProps extends Margins { +export interface GoabBlockProps extends Margins, DataAttributes { gap?: Spacing; direction?: GoabBlockDirection; alignment?: GoabBlockAlignment; + minWidth?: string; + maxWidth?: string; + width?: string; testId?: string; children?: ReactNode; } -export function GoabBlock(props: GoabBlockProps) { +export function GoabBlock({ + testId, + children, + ...rest +}: GoabBlockProps) { + const _props = transformProps( + { testid: testId, ...rest }, + kebab + ); + return ( - - {props.children} + + {children} ); } diff --git a/libs/react-components/src/lib/button-group/button-group.spec.tsx b/libs/react-components/src/lib/button-group/button-group.spec.tsx index 1c685b4410..f5009ca27e 100644 --- a/libs/react-components/src/lib/button-group/button-group.spec.tsx +++ b/libs/react-components/src/lib/button-group/button-group.spec.tsx @@ -11,4 +11,17 @@ describe("GoabButtonGroup", () => { const el = container.querySelector("goa-button-group"); expect(el).toBeTruthy(); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + Content + , + ); + const el = container.querySelector("goa-button-group"); + expect(el?.getAttribute("data-grid")).toBe("row"); + }); }); diff --git a/libs/react-components/src/lib/button-group/button-group.tsx b/libs/react-components/src/lib/button-group/button-group.tsx index 1aa1cf718c..e10399b75a 100644 --- a/libs/react-components/src/lib/button-group/button-group.tsx +++ b/libs/react-components/src/lib/button-group/button-group.tsx @@ -1,10 +1,11 @@ import { GoabButtonGroupAlignment, GoabButtonGroupGap, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import type { JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { alignment: GoabButtonGroupAlignment; @@ -21,7 +22,7 @@ declare module "react" { } } -export interface GoabButtonGroupProps extends Margins { +export interface GoabButtonGroupProps extends Margins, DataAttributes { alignment: GoabButtonGroupAlignment; gap?: GoabButtonGroupGap; testId?: string; @@ -29,25 +30,13 @@ export interface GoabButtonGroupProps extends Margins { } export function GoabButtonGroup({ - alignment, - gap, - testId, children, - mt, - mr, - mb, - ml, + ...rest }: GoabButtonGroupProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/button/button.spec.tsx b/libs/react-components/src/lib/button/button.spec.tsx index 975651bc28..bb7e530fc1 100644 --- a/libs/react-components/src/lib/button/button.spec.tsx +++ b/libs/react-components/src/lib/button/button.spec.tsx @@ -105,6 +105,18 @@ describe("GoabButton", () => { button && fireEvent(button, new CustomEvent("_click")); expect(onClick).toBeCalled(); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + Button Text + , + ); + const el = container.querySelector("goa-button"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); describe("GoabButton disabled attribute", () => { diff --git a/libs/react-components/src/lib/button/button.tsx b/libs/react-components/src/lib/button/button.tsx index 3d67ad3ba8..bde1dae2c8 100644 --- a/libs/react-components/src/lib/button/button.tsx +++ b/libs/react-components/src/lib/button/button.tsx @@ -4,8 +4,9 @@ import { GoabButtonType, GoabButtonVariant, GoabIconType, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { type?: GoabButtonType; @@ -19,19 +20,20 @@ interface WCProps extends Margins { action?: string; actionArgs?: string; actionArg?: string; - ref: React.RefObject; } declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-button": WCProps & React.HTMLAttributes; + "goa-button": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabButtonProps extends Margins { +export interface GoabButtonProps extends Margins, DataAttributes { type?: GoabButtonType; size?: GoabButtonSize; variant?: GoabButtonVariant; @@ -49,25 +51,16 @@ export interface GoabButtonProps extends Margins { export function GoabButton({ disabled, - type, - size, - variant, - leadingIcon, - trailingIcon, - width, - testId, - children, onClick, - mt, - mr, - mb, - ml, - action, actionArgs, actionArg, + children, + ...rest }: GoabButtonProps): JSX.Element { const el = useRef(null); + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) { return; @@ -77,7 +70,7 @@ export function GoabButton({ } const current = el.current; const listener = () => { - onClick(); + onClick?.(); }; current.addEventListener("_click", listener); @@ -89,21 +82,10 @@ export function GoabButton({ return ( {children} diff --git a/libs/react-components/src/lib/calendar/calendar.spec.tsx b/libs/react-components/src/lib/calendar/calendar.spec.tsx index 1aba85654e..2b3b02b087 100644 --- a/libs/react-components/src/lib/calendar/calendar.spec.tsx +++ b/libs/react-components/src/lib/calendar/calendar.spec.tsx @@ -27,9 +27,9 @@ describe("Calendar", () => { }); it("should set the props correctly", () => { - const value = new Date(); - const min = addMonths(value, -1); - const max = addMonths(value, 1); + const value = "2025-02-03"; + const min = "2024-01-01" + const max = "2025-01-01" const { baseElement } = render( { ); const el = baseElement.querySelector("goa-calendar"); expect(baseElement).toBeTruthy(); - expect(el?.getAttribute("value")).toBe(value.toISOString()); - expect(el?.getAttribute("min")).toBe(min.toISOString()); - expect(el?.getAttribute("max")).toBe(max.toISOString()); + expect(el?.getAttribute("value")).toBe(value); + expect(el?.getAttribute("min")).toBe(min); + expect(el?.getAttribute("max")).toBe(max); expect(el?.getAttribute("testid")).toBe("foo"); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + ); + const el = baseElement.querySelector("goa-calendar"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/calendar/calendar.tsx b/libs/react-components/src/lib/calendar/calendar.tsx index 84db318873..1c6277bfb7 100644 --- a/libs/react-components/src/lib/calendar/calendar.tsx +++ b/libs/react-components/src/lib/calendar/calendar.tsx @@ -1,8 +1,8 @@ import { useEffect, useRef, type JSX } from "react"; -import { GoabCalendarOnChangeDetail, Margins } from "@abgov/ui-components-common"; +import { DataAttributes, GoabCalendarOnChangeDetail, Margins } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.RefObject; name?: string; value?: string; min?: string; @@ -14,57 +14,57 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-calendar": WCProps & React.HTMLAttributes; + "goa-calendar": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabCalendarProps extends Margins { +export interface GoabCalendarProps extends Margins, DataAttributes { name?: string; - value?: Date; - min?: Date; - max?: Date; + value?: string; + min?: string; + max?: string; testId?: string; onChange: (details: GoabCalendarOnChangeDetail) => void; } export function GoabCalendar({ - name, - value, min, max, - testId, - mt, - mr, - mb, - ml, onChange, + name, + ...rest }: GoabCalendarProps): JSX.Element { const ref = useRef(null); + + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!ref.current) { return; } const current = ref.current; - current.addEventListener("_change", (e: Event) => { + const listener = (e: Event) => { onChange({ name: name || "", value: (e as CustomEvent).detail.value, }); - }); - }); + } + current.addEventListener("_change", listener); + + return () => { + current.removeEventListener("_change", listener); + } + }, []); return ( ); } diff --git a/libs/react-components/src/lib/callout/callout.spec.tsx b/libs/react-components/src/lib/callout/callout.spec.tsx index fe83ffa226..5478523e83 100644 --- a/libs/react-components/src/lib/callout/callout.spec.tsx +++ b/libs/react-components/src/lib/callout/callout.spec.tsx @@ -60,4 +60,18 @@ describe("Callout", () => { expect(el?.getAttribute("arialive")).toBe(expected); }); }); + + test("should pass data-grid attributes", () => { + const result = render( + + Test content + , + ); + const el = result.container.querySelector("goa-callout"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/callout/callout.tsx b/libs/react-components/src/lib/callout/callout.tsx index ef05e84d2e..acca9779cc 100644 --- a/libs/react-components/src/lib/callout/callout.tsx +++ b/libs/react-components/src/lib/callout/callout.tsx @@ -3,8 +3,9 @@ import { GoabCalloutSize, GoabCalloutType, GoabCalloutIconTheme, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { heading?: string; @@ -25,7 +26,7 @@ declare module "react" { } } -export interface GoabCalloutProps extends Margins { +export interface GoabCalloutProps extends Margins, DataAttributes { heading?: string; type?: GoabCalloutType; size?: GoabCalloutSize; @@ -37,33 +38,20 @@ export interface GoabCalloutProps extends Margins { } export const GoabCallout = ({ - heading, type = "information", iconTheme = "outline", size = "large", - maxWidth, - testId, ariaLive = "off", children, - mt, - mr, - mb, - ml, + ...rest }: GoabCalloutProps) => { + const _props = transformProps( + { type, icontheme: iconTheme, size, arialive: ariaLive, ...rest }, + lowercase + ); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/card/card-actions.tsx b/libs/react-components/src/lib/card/card-actions.tsx index b668542d8f..a7764263a6 100644 --- a/libs/react-components/src/lib/card/card-actions.tsx +++ b/libs/react-components/src/lib/card/card-actions.tsx @@ -1,4 +1,6 @@ import type { JSX } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { @@ -8,12 +10,17 @@ declare module "react" { } } -export interface GoabCardActionsProps { +export interface GoabCardActionsProps extends DataAttributes { children?: React.ReactNode; } -export function GoabCardActions({ children }: GoabCardActionsProps): JSX.Element { - return {children}; +export function GoabCardActions({ + children, + ...rest +}: GoabCardActionsProps): JSX.Element { + const _props = transformProps(rest, lowercase); + + return {children}; } export default GoabCardActions; diff --git a/libs/react-components/src/lib/card/card-content.tsx b/libs/react-components/src/lib/card/card-content.tsx index ca55c019f9..4e3126ddc5 100644 --- a/libs/react-components/src/lib/card/card-content.tsx +++ b/libs/react-components/src/lib/card/card-content.tsx @@ -1,4 +1,6 @@ import type { JSX } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { @@ -8,12 +10,17 @@ declare module "react" { } } -export interface GoabCardContentProps { +export interface GoabCardContentProps extends DataAttributes { children?: React.ReactNode; } -export function GoabCardContent({ children }: GoabCardContentProps): JSX.Element { - return {children}; +export function GoabCardContent({ + children, + ...rest +}: GoabCardContentProps): JSX.Element { + const _props = transformProps(rest, lowercase); + + return {children}; } export default GoabCardContent; diff --git a/libs/react-components/src/lib/card/card-group.tsx b/libs/react-components/src/lib/card/card-group.tsx index f361f6da11..e85f83c037 100644 --- a/libs/react-components/src/lib/card/card-group.tsx +++ b/libs/react-components/src/lib/card/card-group.tsx @@ -1,4 +1,6 @@ import type { JSX } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { @@ -8,12 +10,17 @@ declare module "react" { } } -export interface GoabCardGroupProps { +export interface GoabCardGroupProps extends DataAttributes { children?: React.ReactNode; } -export function GoabCardGroup({ children }: GoabCardGroupProps): JSX.Element { - return {children}; +export function GoabCardGroup({ + children, + ...rest +}: GoabCardGroupProps): JSX.Element { + const _props = transformProps(rest, lowercase); + + return {children}; } export default GoabCardGroup; diff --git a/libs/react-components/src/lib/card/card-image.tsx b/libs/react-components/src/lib/card/card-image.tsx index 6c8eba69a7..90326f3017 100644 --- a/libs/react-components/src/lib/card/card-image.tsx +++ b/libs/react-components/src/lib/card/card-image.tsx @@ -1,4 +1,6 @@ import type { JSX } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { src: string; height: string; @@ -13,13 +15,15 @@ declare module "react" { } } -export interface GoabCardImageProps { +export interface GoabCardImageProps extends DataAttributes { src: string; height: string; } -export function GoabCardImage({ src, height }: GoabCardImageProps): JSX.Element { - return ; +export function GoabCardImage(props: GoabCardImageProps): JSX.Element { + const _props = transformProps(props, lowercase); + + return ; } export default GoabCardImage; diff --git a/libs/react-components/src/lib/card/card.spec.tsx b/libs/react-components/src/lib/card/card.spec.tsx index aeddce6d90..a63e4285dc 100644 --- a/libs/react-components/src/lib/card/card.spec.tsx +++ b/libs/react-components/src/lib/card/card.spec.tsx @@ -16,4 +16,16 @@ describe("GoabCard", () => { expect(el?.getAttribute("mb")).toBe("l"); expect(el?.getAttribute("ml")).toBe("xl"); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + Card content + , + ); + const el = container.querySelector("goa-card"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/card/card.tsx b/libs/react-components/src/lib/card/card.tsx index d71532ac30..022efbe203 100644 --- a/libs/react-components/src/lib/card/card.tsx +++ b/libs/react-components/src/lib/card/card.tsx @@ -1,6 +1,7 @@ -import { Margins } from "@abgov/ui-components-common"; +import { DataAttributes, Margins } from "@abgov/ui-components-common"; import type { JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { elevation?: number; @@ -18,7 +19,7 @@ declare module "react" { } } -export interface GoabCardProps extends Margins { +export interface GoabCardProps extends Margins, DataAttributes { elevation?: number; width?: string; testId?: string; @@ -26,25 +27,13 @@ export interface GoabCardProps extends Margins { } export function GoabCard({ - elevation, - width, - mt, - mr, - mb, - ml, - testId, children, + ...rest }: GoabCardProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/checkbox-list/checkbox-list.spec.tsx b/libs/react-components/src/lib/checkbox-list/checkbox-list.spec.tsx index ccb10e3bb5..7d0c555459 100644 --- a/libs/react-components/src/lib/checkbox-list/checkbox-list.spec.tsx +++ b/libs/react-components/src/lib/checkbox-list/checkbox-list.spec.tsx @@ -90,9 +90,11 @@ describe("GoabCheckboxList (React)", () => { const el = document.querySelector("goa-checkbox-list"); expect(el).toBeTruthy(); + const changeEvent = new Event("change"); const detail: GoabCheckboxListOnChangeDetail = { name: "foo", value: ["x", "y"], + event: changeEvent, }; el && @@ -104,7 +106,9 @@ describe("GoabCheckboxList (React)", () => { ); expect(onChange).toHaveBeenCalledTimes(1); - expect(onChange).toHaveBeenCalledWith(detail); + expect(onChange).toHaveBeenCalledWith( + expect.objectContaining({ ...detail, event: expect.any(Event) }), + ); }); it("should update onChange handler when prop changes", () => { diff --git a/libs/react-components/src/lib/checkbox-list/checkbox-list.tsx b/libs/react-components/src/lib/checkbox-list/checkbox-list.tsx index 39cdd77801..c1d83754f6 100644 --- a/libs/react-components/src/lib/checkbox-list/checkbox-list.tsx +++ b/libs/react-components/src/lib/checkbox-list/checkbox-list.tsx @@ -57,7 +57,7 @@ export function GoabCheckboxList({ const listener = (e: Event) => { try { const detail = (e as CustomEvent).detail; - onChange?.(detail); + onChange?.({ ...detail, event: e }); } catch (error) { console.error("Error handling checkbox list change:", error); } diff --git a/libs/react-components/src/lib/checkbox/checkbox.spec.tsx b/libs/react-components/src/lib/checkbox/checkbox.spec.tsx index 387dd19ff9..490cd10a60 100644 --- a/libs/react-components/src/lib/checkbox/checkbox.spec.tsx +++ b/libs/react-components/src/lib/checkbox/checkbox.spec.tsx @@ -145,4 +145,15 @@ describe("GoabCheckbox", () => { ); expect(onChangeStub).toBeCalled(); }); + + it("should pass data-grid attributes", () => { + render( + + ); + const checkbox = document.querySelector("goa-checkbox"); + expect(checkbox?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/checkbox/checkbox.tsx b/libs/react-components/src/lib/checkbox/checkbox.tsx index 840aa10095..2cffd847f2 100644 --- a/libs/react-components/src/lib/checkbox/checkbox.tsx +++ b/libs/react-components/src/lib/checkbox/checkbox.tsx @@ -1,17 +1,19 @@ -import { GoabCheckboxOnChangeDetail, Margins } from "@abgov/ui-components-common"; +import { DataAttributes, GoabCheckboxOnChangeDetail, Margins } from "@abgov/ui-components-common"; import { useEffect, useRef, type JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-checkbox": WCProps & React.HTMLAttributes; + "goa-checkbox": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } interface WCProps extends Margins { - ref: React.RefObject; id?: string; name: string; checked?: string; @@ -29,7 +31,7 @@ interface WCProps extends Margins { } /* eslint-disable-next-line */ -export interface GoabCheckboxProps extends Margins { +export interface GoabCheckboxProps extends Margins, DataAttributes { id?: string; name: string; checked?: boolean; @@ -52,28 +54,22 @@ export interface GoabCheckboxProps extends Margins { export type Props = GoabCheckboxProps; export function GoabCheckbox({ - id, - name, - testId, error, - disabled, checked, indeterminate, + disabled, value, - text, description, reveal, - revealAriaLabel, - maxWidth, - children, onChange, - ariaLabel, - mt, - mr, - mb, - ml, + name, + children, + ...rest }: GoabCheckboxProps): JSX.Element { const el = useRef(null); + + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) { return; @@ -81,7 +77,7 @@ export function GoabCheckbox({ const current = el.current; const listener = (e: Event) => { const detail = (e as CustomEvent).detail; - onChange?.(detail); + onChange?.({ ...detail, event: e }); }; current.addEventListener("_change", listener); @@ -93,24 +89,15 @@ export function GoabCheckbox({ return ( {children} {typeof description !== "string" && description && ( diff --git a/libs/react-components/src/lib/chip/chip.spec.tsx b/libs/react-components/src/lib/chip/chip.spec.tsx index 2a78fa27b0..16f55d73d0 100644 --- a/libs/react-components/src/lib/chip/chip.spec.tsx +++ b/libs/react-components/src/lib/chip/chip.spec.tsx @@ -46,4 +46,15 @@ describe("GoabChip", () => { el && fireEvent(el, new CustomEvent("_click")); expect(onClick).toHaveBeenCalled(); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + ); + const el = container.querySelector("goa-chip"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/chip/chip.tsx b/libs/react-components/src/lib/chip/chip.tsx index b59f1abae1..00baa72a94 100644 --- a/libs/react-components/src/lib/chip/chip.tsx +++ b/libs/react-components/src/lib/chip/chip.tsx @@ -1,8 +1,8 @@ -import { GoabChipTheme, GoabChipVariant, Margins } from "@abgov/ui-components-common"; +import { DataAttributes, GoabChipTheme, GoabChipVariant, Margins } from "@abgov/ui-components-common"; import { useEffect, useRef } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.RefObject; leadingicon?: string; icontheme?: GoabChipTheme; error?: string; @@ -16,12 +16,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-chip": WCProps & React.HTMLAttributes; + "goa-chip": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabChipProps extends Margins { +export interface GoabChipProps extends Margins, DataAttributes { onClick?: () => void; deletable?: boolean; leadingIcon?: string; @@ -33,27 +35,22 @@ export interface GoabChipProps extends Margins { } export const GoabChip = ({ - leadingIcon, - iconTheme, - deletable, error, - variant, - content, + deletable, onClick, - mt, - mr, - mb, - ml, - testId, + ...rest }: GoabChipProps) => { const el = useRef(null); + + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) return; if (!onClick) return; const current = el.current; const listener = () => { - onClick(); + onClick?.(); }; current.addEventListener("_click", listener); @@ -65,17 +62,9 @@ export const GoabChip = ({ return ( ); }; diff --git a/libs/react-components/src/lib/common/extract-props.spec.ts b/libs/react-components/src/lib/common/extract-props.spec.ts new file mode 100644 index 0000000000..ae218e8bbb --- /dev/null +++ b/libs/react-components/src/lib/common/extract-props.spec.ts @@ -0,0 +1,161 @@ +import { transformProps, lowercase, kebab } from "./extract-props"; +import { describe, it, expect } from "vitest"; + +describe("transformProps", () => { + describe("lowercase transform", () => { + it("should convert camelCase props to lowercase", () => { + const props = { + headingSize: "large", + maxWidth: "500px", + testId: "my-test", + }; + + const result = transformProps(props, lowercase); + + expect(result).toEqual({ + headingsize: "large", + maxwidth: "500px", + testid: "my-test", + }); + }); + + it("should pass through data- props unchanged", () => { + const props = { + "data-grid": "cell", + "data-grid-column": "name", + headingSize: "large", + }; + + const result = transformProps(props, lowercase); + + expect(result).toEqual({ + "data-grid": "cell", + "data-grid-column": "name", + headingsize: "large", + }); + }); + }); + + describe("kebab transform", () => { + it("should convert camelCase props to kebab-case", () => { + const props = { + verticalPosition: "top", + horizontalPosition: "center", + }; + + const result = transformProps(props, kebab); + + expect(result).toEqual({ + "vertical-position": "top", + "horizontal-position": "center", + }); + }); + + it("should pass through data- props unchanged in kebab mode", () => { + const props = { + "data-grid": "cell", + verticalPosition: "top", + }; + + const result = transformProps(props, kebab); + + expect(result).toEqual({ + "data-grid": "cell", + "vertical-position": "top", + }); + }); + }); + + describe("edge cases", () => { + it("should handle empty props object", () => { + const result = transformProps({}, lowercase); + expect(result).toEqual({}); + }); + + it("should skip props with undefined values", () => { + const props = { + headingSize: undefined, + maxWidth: "500px", + }; + + const result = transformProps(props, lowercase); + + expect(result).toEqual({ + maxwidth: "500px", + }); + }); + + it("should handle props with null values", () => { + const props = { + headingSize: null, + maxWidth: "500px", + }; + + const result = transformProps(props, lowercase); + + expect(result).toEqual({ + headingsize: null, + maxwidth: "500px", + }); + }); + + it("should use lowercase as default when no transform specified", () => { + const props = { + headingSize: "large", + }; + + const result = transformProps(props); + + expect(result).toEqual({ + headingsize: "large", + }); + }); + }); + + describe("destructuring pattern (recommended usage)", () => { + it("should work with rest props after destructuring excluded props", () => { + // Simulating the recommended pattern: + // const { onChange, open, children, ...rest } = props; + // const _props = transformProps(rest, lowercase); + + const originalProps = { + headingSize: "large", + onChange: () => { /* noop */ }, + open: true, + children: "some content", + }; + + // Destructure the props that need special handling + const { onChange, open, children, ...rest } = originalProps; + + const result = transformProps(rest, lowercase); + + expect(result).toEqual({ + headingsize: "large", + }); + // onChange, open, children are available separately + expect(typeof onChange).toBe("function"); + expect(open).toBe(true); + expect(children).toBe("some content"); + }); + }); +}); + +describe("transform functions", () => { + describe("lowercase", () => { + it("should convert string to lowercase", () => { + expect(lowercase("HeadingSize")).toBe("headingsize"); + expect(lowercase("maxWidth")).toBe("maxwidth"); + expect(lowercase("testId")).toBe("testid"); + }); + }); + + describe("kebab", () => { + it("should convert camelCase to kebab-case", () => { + expect(kebab("verticalPosition")).toBe("vertical-position"); + expect(kebab("horizontalPosition")).toBe("horizontal-position"); + expect(kebab("maxWidth")).toBe("max-width"); + expect(kebab("testId")).toBe("test-id"); + }); + }); +}); diff --git a/libs/react-components/src/lib/common/extract-props.ts b/libs/react-components/src/lib/common/extract-props.ts new file mode 100644 index 0000000000..ccfd861c87 --- /dev/null +++ b/libs/react-components/src/lib/common/extract-props.ts @@ -0,0 +1,55 @@ +/** + * Transform function type for converting prop names to attribute names. + */ +export type TransformFn = (input: string) => string; + +/** + * Converts a camelCase string to lowercase (e.g., "headingSize" -> "headingsize") + */ +export const lowercase: TransformFn = (input) => input.toLowerCase(); + +/** + * Converts a camelCase string to kebab-case (e.g., "verticalPosition" -> "vertical-position") + */ +export const kebab: TransformFn = (input) => + input.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); + +/** + * Transforms React props to web component attributes. + * Use object destructuring to extract props that need special handling, + * then pass the rest through this function. + * + * @param props - The remaining props after destructuring + * @param transform - Transform function (lowercase or kebab), defaults to lowercase + * @returns Converted props ready to spread on the web component + * + * @example + * export function GoabAccordion({open, onChange, headingContent, children, ...rest}: GoabAccordionProps) { + * const _props = transformProps(rest, lowercase); + * return ( + * + * {children} + * + * ); + * } + */ +export function transformProps>( + props: object, + transform: TransformFn = lowercase +): WC { + const result: Record = {}; + + for (const [key, value] of Object.entries(props)) { + // Skip undefined values - they shouldn't be passed to web components + if (value === undefined) continue; + + // Data attributes pass through unchanged + if (key.startsWith("data-")) { + result[key] = value; + } else { + result[transform(key)] = value; + } + } + + return result as WC; +} diff --git a/libs/react-components/src/lib/container/container.spec.tsx b/libs/react-components/src/lib/container/container.spec.tsx index c579bf3cf7..b75208c4a3 100644 --- a/libs/react-components/src/lib/container/container.spec.tsx +++ b/libs/react-components/src/lib/container/container.spec.tsx @@ -12,6 +12,8 @@ describe("Container", () => { title={"Text title"} width="content" maxWidth="480px" + minHeight="240px" + maxHeight="360px" mt="s" mr="m" mb="l" @@ -42,10 +44,24 @@ describe("Container", () => { expect(el?.getAttribute("ml")).toBe("xl"); expect(el?.getAttribute("width")).toBe("content"); expect(el?.getAttribute("maxwidth")).toBe("480px"); + expect(el?.getAttribute("minheight")).toBe("240px"); + expect(el?.getAttribute("maxheight")).toBe("360px"); expect(el?.querySelector("*[slot=title]")?.innerHTML).toContain("Text title"); expect( el?.querySelector("*[slot=actions]")?.querySelector("goa-button"), ).not.toBeFalsy(); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + Container content + , + ); + const el = container.querySelector("goa-container"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/container/container.tsx b/libs/react-components/src/lib/container/container.tsx index a4835f7cba..e80211caff 100644 --- a/libs/react-components/src/lib/container/container.tsx +++ b/libs/react-components/src/lib/container/container.tsx @@ -3,9 +3,10 @@ import { GoabContainerPadding, GoabContainerType, GoabContainerWidth, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import { ReactNode, type JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { type?: GoabContainerType; @@ -13,6 +14,8 @@ interface WCProps extends Margins { padding?: GoabContainerPadding; width?: GoabContainerWidth; maxwidth?: string; + minheight?: string; + maxheight?: string; testid?: string; } @@ -25,7 +28,7 @@ declare module "react" { } } -export interface GoabContainerProps extends Margins { +export interface GoabContainerProps extends Margins, DataAttributes { accent?: GoabContainerAccent; type?: GoabContainerType; heading?: ReactNode; @@ -35,39 +38,24 @@ export interface GoabContainerProps extends Margins { children?: ReactNode; width?: GoabContainerWidth; maxWidth?: string; + minHeight?: string; + maxHeight?: string; testId?: string; } export function GoabContainer({ - accent, heading, title, - padding, - children, actions, - type, - width, - maxWidth, - mt, - mr, - mb, - ml, - testId, + children, + ...rest }: GoabContainerProps): JSX.Element { + const _props = transformProps(rest, lowercase); + const headingContent = heading || title; + return ( - + {headingContent &&
{headingContent}
} {children} {actions &&
{actions}
} diff --git a/libs/react-components/src/lib/data-grid/data-grid.spec.tsx b/libs/react-components/src/lib/data-grid/data-grid.spec.tsx new file mode 100644 index 0000000000..c27e2ee2e8 --- /dev/null +++ b/libs/react-components/src/lib/data-grid/data-grid.spec.tsx @@ -0,0 +1,63 @@ +import { render } from "@testing-library/react"; +import { GoabDataGrid } from "./data-grid"; + +describe("GoabDataGrid", () => { + it("should create component and render goa-data-grid with projected content", () => { + const { container } = render( + +
Test content
+
+ ); + + const el = container.querySelector("goa-data-grid"); + expect(el).toBeTruthy(); + expect(el?.textContent).toContain("Test content"); + expect(el?.getAttribute("keyboard-icon-visibility")).toBe("visible"); + expect(el?.getAttribute("keyboard-icon-position")).toBe("left"); + expect(el?.getAttribute("keyboard-nav")).toBe("table"); + }); + + it("should hide keyboard icon when keyboardIconVisibility is hidden", () => { + const { container } = render( + +
Test content
+
+ ); + + const el = container.querySelector("goa-data-grid"); + expect(el?.getAttribute("keyboard-icon-visibility")).toBe("hidden"); + }); + + it("should set keyboard icon position to right", () => { + const { container } = render( + +
Test content
+
+ ); + + const el = container.querySelector("goa-data-grid"); + expect(el?.getAttribute("keyboard-icon-position")).toBe("right"); + }); + + it("should set keyboardNav to table mode", () => { + const { container } = render( + +
Test content
+
+ ); + + const el = container.querySelector("goa-data-grid"); + expect(el?.getAttribute("keyboard-nav")).toBe("table"); + }); + + it("should set keyboardNav to layout mode", () => { + const { container } = render( + +
Test content
+
+ ); + + const el = container.querySelector("goa-data-grid"); + expect(el?.getAttribute("keyboard-nav")).toBe("layout"); + }); +}); diff --git a/libs/react-components/src/lib/data-grid/data-grid.tsx b/libs/react-components/src/lib/data-grid/data-grid.tsx new file mode 100644 index 0000000000..bb0042dfb6 --- /dev/null +++ b/libs/react-components/src/lib/data-grid/data-grid.tsx @@ -0,0 +1,42 @@ +import React from "react"; + +interface WCProps { + "keyboard-icon-visibility"?: "visible" | "hidden"; + "keyboard-icon-position"?: "left" | "right"; + "keyboard-nav"?: "layout" | "table"; +} + +declare module "react" { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace JSX { + interface IntrinsicElements { + "goa-data-grid": WCProps & React.HTMLAttributes; + } + } +} + +export interface GoabDataGridProps { + keyboardIconVisibility?: "visible" | "hidden"; + keyboardIconPosition?: "left" | "right"; + keyboardNav: "layout" | "table"; + children?: React.ReactNode; +} + +export function GoabDataGrid({ + keyboardIconVisibility = "visible", + keyboardIconPosition = "left", + keyboardNav, + children, +}: GoabDataGridProps) { + return ( + + {children} + + ); +} + +export default GoabDataGrid; diff --git a/libs/react-components/src/lib/date-picker/date-picker.spec.tsx b/libs/react-components/src/lib/date-picker/date-picker.spec.tsx index c718674922..92e1ac629d 100644 --- a/libs/react-components/src/lib/date-picker/date-picker.spec.tsx +++ b/libs/react-components/src/lib/date-picker/date-picker.spec.tsx @@ -1,6 +1,6 @@ import { render } from "@testing-library/react"; import { addMonths } from "date-fns"; -import { describe, it, expect } from "vitest"; +import { describe, it, expect, vi } from "vitest"; import DatePicker from "./date-picker"; @@ -52,4 +52,40 @@ describe("DatePicker", () => { expect(el?.getAttribute("type")).toBe("input"); }); + it("should handle event", async () => { + const name = "foo"; + const value = new Date(); + const changeEvent = new Event("change"); + + const onChange = vi.fn(); + const { baseElement } = render( + , + ); + + const el = baseElement.querySelector("goa-date-picker"); + + el?.dispatchEvent( + new CustomEvent("_change", { + composed: true, + bubbles: true, + detail: { type: "date", name, value, event: changeEvent }, + }), + ); + + expect(onChange).toHaveBeenCalledTimes(1); + expect(onChange).toBeCalledWith({ + name, + value, + type: "date", + event: expect.any(Event), + }); + }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + , + ); + const el = baseElement.querySelector("goa-date-picker"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/date-picker/date-picker.tsx b/libs/react-components/src/lib/date-picker/date-picker.tsx index e75b46e546..20bac740a7 100644 --- a/libs/react-components/src/lib/date-picker/date-picker.tsx +++ b/libs/react-components/src/lib/date-picker/date-picker.tsx @@ -2,11 +2,11 @@ import { useEffect, useRef, type JSX } from "react"; import { GoabDatePickerInputType, GoabDatePickerOnChangeDetail, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.RefObject; name?: string; value?: string; error?: string; @@ -16,18 +16,21 @@ interface WCProps extends Margins { relative?: string; disabled?: string; testid?: string; + width?: string; } declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-date-picker": WCProps & React.HTMLAttributes; + "goa-date-picker": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabDatePickerProps extends Margins { +export interface GoabDatePickerProps extends Margins, DataAttributes { name?: string; value?: Date | string | undefined; error?: boolean; @@ -40,27 +43,30 @@ export interface GoabDatePickerProps extends Margins { */ relative?: boolean; disabled?: boolean; + width?: string; onChange?: (detail: GoabDatePickerOnChangeDetail) => void; } export function GoabDatePicker({ - name, value, error, min, max, - testId, disabled, - type, - mt, - mr, - mb, - ml, relative, onChange, + ...rest }: GoabDatePickerProps): JSX.Element { const ref = useRef(null); + const _props = transformProps(rest, lowercase); + + useEffect(() => { + if (value && typeof value !== "string") { + console.warn("Using a `Date` type for value is deprecated. Instead use a string of the format `yyyy-mm-dd`") + } + }, []); + useEffect(() => { if (!ref.current) { return; @@ -69,7 +75,7 @@ export function GoabDatePicker({ const handleChange = (e: Event) => { const detail = (e as CustomEvent).detail; - onChange?.(detail); + onChange?.({ ...detail, event: e }); }; if (onChange) { @@ -83,32 +89,26 @@ export function GoabDatePicker({ }; }, [onChange]); - const formatValue = (value: Date | string | undefined) => { - if (!value) return ""; + const formatValue = (val: Date | string | undefined) => { + if (!val) return ""; - if (value instanceof Date) { - return value.toISOString(); + if (val instanceof Date) { + return val.toISOString(); } - return value; + return val; }; return ( ); } diff --git a/libs/react-components/src/lib/details/details.spec.tsx b/libs/react-components/src/lib/details/details.spec.tsx index 77003cfcbf..2ee7488ceb 100644 --- a/libs/react-components/src/lib/details/details.spec.tsx +++ b/libs/react-components/src/lib/details/details.spec.tsx @@ -28,4 +28,17 @@ describe("Detail", () => { expect(el?.getAttribute("maxwidth")).toBe("480px"); expect(el?.getAttribute("testid")).toBe("foo"); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Detail content + + ); + const el = baseElement.querySelector("goa-details"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/details/details.tsx b/libs/react-components/src/lib/details/details.tsx index 83bcaa74f3..3abb840fba 100644 --- a/libs/react-components/src/lib/details/details.tsx +++ b/libs/react-components/src/lib/details/details.tsx @@ -1,5 +1,6 @@ -import { Margins } from "@abgov/ui-components-common"; +import { Margins, DataAttributes } from "@abgov/ui-components-common"; import { ReactNode } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { heading: string; @@ -18,7 +19,7 @@ declare module "react" { } /* eslint-disable-next-line */ -export interface GoabDetailsProps extends Margins { +export interface GoabDetailsProps extends Margins, DataAttributes { heading: string; open?: boolean; maxWidth?: string; @@ -26,19 +27,19 @@ export interface GoabDetailsProps extends Margins { children: ReactNode; } -export function GoabDetails(props: GoabDetailsProps) { +export function GoabDetails({ + open, + children, + ...rest +}: GoabDetailsProps) { + const _props = transformProps(rest, lowercase); + return ( - {props.children} + {children} ); } diff --git a/libs/react-components/src/lib/dropdown/dropdown.spec.tsx b/libs/react-components/src/lib/dropdown/dropdown.spec.tsx index 6576d6a4b9..8853e67085 100644 --- a/libs/react-components/src/lib/dropdown/dropdown.spec.tsx +++ b/libs/react-components/src/lib/dropdown/dropdown.spec.tsx @@ -108,7 +108,27 @@ describe("GoabDropdown", () => { new CustomEvent("_change", { detail: { name: "favColor", value: "blue" } }), ); await waitFor(() => { - expect(fn).toBeCalledWith({ name: "favColor", value: "blue" }); + expect(fn).toBeCalledWith( + expect.objectContaining({ + name: "favColor", + value: "blue", + event: expect.any(Event), + }), + ); }); }); -}); \ No newline at end of file + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + + + ); + const el = baseElement.querySelector("goa-dropdown"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); +}); diff --git a/libs/react-components/src/lib/dropdown/dropdown.tsx b/libs/react-components/src/lib/dropdown/dropdown.tsx index b5700d6b32..ae29650616 100644 --- a/libs/react-components/src/lib/dropdown/dropdown.tsx +++ b/libs/react-components/src/lib/dropdown/dropdown.tsx @@ -1,12 +1,12 @@ import { GoabDropdownOnChangeDetail, GoabIconType, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import { useEffect, useRef, type JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.RefObject; arialabel?: string; arialabelledby?: string; disabled?: string; @@ -32,12 +32,14 @@ declare module "react" { namespace JSX { // eslint-disable-next-line @typescript-eslint/no-empty-interface interface IntrinsicElements { - "goa-dropdown": WCProps & React.HTMLAttributes; + "goa-dropdown": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabDropdownProps extends Margins { +export interface GoabDropdownProps extends Margins, DataAttributes { name?: string; value?: string[] | string; onChange?: (detail: GoabDropdownOnChangeDetail) => void; @@ -75,8 +77,22 @@ function stringify(value: string | string[] | undefined): string { return JSON.stringify(value); } -export function GoabDropdown(props: GoabDropdownProps): JSX.Element { +export function GoabDropdown({ + value, + onChange, + disabled, + error, + filterable, + multiselect, + native, + relative, + children, + ...rest +}: GoabDropdownProps): JSX.Element { const el = useRef(null); + + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) { return; @@ -84,45 +100,31 @@ export function GoabDropdown(props: GoabDropdownProps): JSX.Element { const current = el.current; const handler = (e: Event) => { const detail = (e as CustomEvent).detail; - props.onChange?.(detail); + onChange?.({ ...detail, event: e }); }; - if (props.onChange) { + if (onChange) { current.addEventListener("_change", handler); } return () => { - if (props.onChange) { + if (onChange) { current.removeEventListener("_change", handler); } }; - }, [el, props]); + }, [el, onChange]); return ( - {props.children} + {children} ); } diff --git a/libs/react-components/src/lib/file-upload-card/file-upload-card.spec.tsx b/libs/react-components/src/lib/file-upload-card/file-upload-card.spec.tsx index e127560f0d..687806f37b 100644 --- a/libs/react-components/src/lib/file-upload-card/file-upload-card.spec.tsx +++ b/libs/react-components/src/lib/file-upload-card/file-upload-card.spec.tsx @@ -105,4 +105,16 @@ describe("FileUploadCard", () => { expect(el?.getAttribute("testid")).toBeNull(); }); + it("should pass data-grid attributes", () => { + const { container } = render( + + ); + const el = container.querySelector("goa-file-upload-card"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); + }); \ No newline at end of file diff --git a/libs/react-components/src/lib/file-upload-card/file-upload-card.tsx b/libs/react-components/src/lib/file-upload-card/file-upload-card.tsx index 3d2230620a..069f9f6a4b 100644 --- a/libs/react-components/src/lib/file-upload-card/file-upload-card.tsx +++ b/libs/react-components/src/lib/file-upload-card/file-upload-card.tsx @@ -1,11 +1,12 @@ import { + DataAttributes, GoabFileUploadOnCancelDetail, GoabFileUploadOnDeleteDetail, } from "@abgov/ui-components-common"; import { useEffect, useRef } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { - ref: React.RefObject; filename: string; size: number; type?: string; @@ -18,13 +19,15 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-file-upload-card": WCProps & React.HTMLAttributes; + "goa-file-upload-card": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } /* eslint-disable-next-line */ -export interface GoabFileUploadCardProps { +export interface GoabFileUploadCardProps extends DataAttributes { filename: string; size: number; type?: string; @@ -36,41 +39,31 @@ export interface GoabFileUploadCardProps { } export function GoabFileUploadCard({ - filename, - size, - type, - progress, - error, - testId, onDelete, onCancel, + filename, + ...rest }: GoabFileUploadCardProps) { const el = useRef(null); + const _props = transformProps({ filename, ...rest }, lowercase); + useEffect(() => { if (!el.current) return; const current = el.current; - const deleteHandler = () => onDelete?.({ filename }); - const cancelHandler = () => onCancel?.({ filename }); + const deleteHandler = (event: Event) => onDelete?.({ filename, event }); + const cancelHandler = (event: Event) => onCancel?.({ filename, event }); current.addEventListener("_delete", deleteHandler); current.addEventListener("_cancel", cancelHandler); return () => { current.removeEventListener("_delete", deleteHandler); current.removeEventListener("_cancel", cancelHandler); }; - }, [el, onDelete, onCancel]); + }, [el, onDelete, onCancel, filename]); return ( - + ); } diff --git a/libs/react-components/src/lib/file-upload-input/file-upload-input.spec.tsx b/libs/react-components/src/lib/file-upload-input/file-upload-input.spec.tsx index 6a5b35fa63..5161adea66 100644 --- a/libs/react-components/src/lib/file-upload-input/file-upload-input.spec.tsx +++ b/libs/react-components/src/lib/file-upload-input/file-upload-input.spec.tsx @@ -32,4 +32,15 @@ describe("FileUploadInput", () => { expect(onSelect).toBeCalled(); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + ); + const el = baseElement.querySelector("goa-file-upload-input"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/file-upload-input/file-upload-input.tsx b/libs/react-components/src/lib/file-upload-input/file-upload-input.tsx index d262310dff..49dae30734 100644 --- a/libs/react-components/src/lib/file-upload-input/file-upload-input.tsx +++ b/libs/react-components/src/lib/file-upload-input/file-upload-input.tsx @@ -1,11 +1,12 @@ import { + DataAttributes, GoabFileUploadInputOnSelectFileDetail, GoabFileUploadInputVariant, } from "@abgov/ui-components-common"; import { useEffect, useRef } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { - ref: React.RefObject; variant?: GoabFileUploadInputVariant; accept?: string; maxfilesize?: string; @@ -16,13 +17,15 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-file-upload-input": WCProps & React.HTMLAttributes; + "goa-file-upload-input": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } /* eslint-disable-next-line */ -export interface GoabFileUploadInputProps { +export interface GoabFileUploadInputProps extends DataAttributes { variant?: GoabFileUploadInputVariant; accept?: string; maxFileSize?: string; @@ -31,21 +34,20 @@ export interface GoabFileUploadInputProps { } export function GoabFileUploadInput({ - variant, - accept, - maxFileSize, - testId, onSelectFile, + ...rest }: GoabFileUploadInputProps) { const el = useRef(null); + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) return; const current = el.current; const handler = (e: Event) => { const detail = (e as CustomEvent).detail; - onSelectFile(detail); + onSelectFile({ ...detail, event: e }); }; current.addEventListener("_selectFile", handler); return () => { @@ -54,13 +56,7 @@ export function GoabFileUploadInput({ }, [el, onSelectFile]); return ( - + ); } diff --git a/libs/react-components/src/lib/filter-chip/filter-chip.spec.tsx b/libs/react-components/src/lib/filter-chip/filter-chip.spec.tsx index f4cda93b78..7830461ccc 100644 --- a/libs/react-components/src/lib/filter-chip/filter-chip.spec.tsx +++ b/libs/react-components/src/lib/filter-chip/filter-chip.spec.tsx @@ -67,4 +67,15 @@ describe("GoA FilterChip", () => { fireEvent.mouseOver(chip!); expect(chip).not.toHaveStyle("background-color: var(--goa-color-greyscale-200)"); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + ); + const el = container.querySelector("goa-filter-chip"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/filter-chip/filter-chip.tsx b/libs/react-components/src/lib/filter-chip/filter-chip.tsx index 77f618ee95..c4249dadce 100644 --- a/libs/react-components/src/lib/filter-chip/filter-chip.tsx +++ b/libs/react-components/src/lib/filter-chip/filter-chip.tsx @@ -1,8 +1,8 @@ import { useEffect, useRef } from "react"; -import { Margins, GoabFilterChipTheme } from "@abgov/ui-components-common"; +import { DataAttributes, GoabFilterChipTheme, Margins } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.RefObject; icontheme: GoabFilterChipTheme; error?: string; content: string; @@ -13,12 +13,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-filter-chip": WCProps & React.HTMLAttributes; + "goa-filter-chip": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabFilterChipProps extends Margins { +export interface GoabFilterChipProps extends Margins, DataAttributes { onClick?: () => void; iconTheme?: GoabFilterChipTheme; error?: boolean; @@ -29,15 +31,16 @@ export interface GoabFilterChipProps extends Margins { export const GoabFilterChip = ({ iconTheme = "outline", error, - content, onClick, - mt, - mr, - mb, - ml, - testId, + ...rest }: GoabFilterChipProps) => { const el = useRef(null); + + const _props = transformProps( + { icontheme: iconTheme, ...rest }, + lowercase + ); + useEffect(() => { if (!el.current) return; if (!onClick) return; @@ -46,21 +49,15 @@ export const GoabFilterChip = ({ current.addEventListener("_click", onClick); return () => { - current.removeEventListener("_click", onClick); + current.removeEventListener("_click", onClick!); }; }, [el, onClick]); return ( ); }; diff --git a/libs/react-components/src/lib/footer-meta-section/footer-meta-section.spec.tsx b/libs/react-components/src/lib/footer-meta-section/footer-meta-section.spec.tsx index 3b93e44b39..854d1b1e32 100644 --- a/libs/react-components/src/lib/footer-meta-section/footer-meta-section.spec.tsx +++ b/libs/react-components/src/lib/footer-meta-section/footer-meta-section.spec.tsx @@ -9,4 +9,16 @@ describe("FooterMetaSection", () => { expect(baseElement).toBeTruthy(); expect(el?.getAttribute("testid")).toBe("foo"); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Meta content + + ); + const el = baseElement.querySelector("goa-app-footer-meta-section"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/footer-meta-section/footer-meta-section.tsx b/libs/react-components/src/lib/footer-meta-section/footer-meta-section.tsx index 26fe89c566..2def8880e9 100644 --- a/libs/react-components/src/lib/footer-meta-section/footer-meta-section.tsx +++ b/libs/react-components/src/lib/footer-meta-section/footer-meta-section.tsx @@ -1,4 +1,6 @@ import { ReactNode } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { testid?: string; @@ -14,17 +16,19 @@ declare module "react" { } /* eslint-disable-next-line */ -export interface GoabAppFooterMetaSectionProps { +export interface GoabAppFooterMetaSectionProps extends DataAttributes { testId?: string; children?: ReactNode; } export function GoabAppFooterMetaSection({ - testId, children, + ...rest }: GoabAppFooterMetaSectionProps) { + const _props = transformProps(rest, lowercase); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/footer-nav-section/footer-nav-section.spec.tsx b/libs/react-components/src/lib/footer-nav-section/footer-nav-section.spec.tsx index d0948889ca..c2e7b16319 100644 --- a/libs/react-components/src/lib/footer-nav-section/footer-nav-section.spec.tsx +++ b/libs/react-components/src/lib/footer-nav-section/footer-nav-section.spec.tsx @@ -7,4 +7,17 @@ describe("FooterNavSection", () => { const { baseElement } = render(); expect(baseElement).toBeTruthy(); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Nav content + + ); + const el = baseElement.querySelector("goa-app-footer-nav-section"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/footer-nav-section/footer-nav-section.tsx b/libs/react-components/src/lib/footer-nav-section/footer-nav-section.tsx index 42b3268bd1..92eb37305b 100644 --- a/libs/react-components/src/lib/footer-nav-section/footer-nav-section.tsx +++ b/libs/react-components/src/lib/footer-nav-section/footer-nav-section.tsx @@ -1,4 +1,6 @@ import { ReactNode } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { maxcolumncount?: number; @@ -16,7 +18,7 @@ declare module "react" { } /* eslint-disable-next-line */ -export interface GoabFooterNavSectionProps { +export interface GoabFooterNavSectionProps extends DataAttributes { maxColumnCount?: number; heading?: string; testId?: string; @@ -24,18 +26,13 @@ export interface GoabFooterNavSectionProps { } export function GoabAppFooterNavSection({ - heading, - maxColumnCount = 1, - testId, children, + ...rest }: GoabFooterNavSectionProps) { + const _props = transformProps(rest, lowercase); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/footer/footer.spec.tsx b/libs/react-components/src/lib/footer/footer.spec.tsx index da5bd35938..f5957f4774 100644 --- a/libs/react-components/src/lib/footer/footer.spec.tsx +++ b/libs/react-components/src/lib/footer/footer.spec.tsx @@ -7,4 +7,16 @@ describe("Footer", () => { const { baseElement } = render(
); expect(baseElement).toBeTruthy(); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( +
+ Footer content +
+ ); + const el = baseElement.querySelector("goa-app-footer"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/footer/footer.tsx b/libs/react-components/src/lib/footer/footer.tsx index 931cd599aa..2caba0ad5f 100644 --- a/libs/react-components/src/lib/footer/footer.tsx +++ b/libs/react-components/src/lib/footer/footer.tsx @@ -1,4 +1,6 @@ import { ReactNode, type JSX } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { maxcontentwidth?: string; @@ -16,7 +18,7 @@ declare module "react" { } /* eslint-disable-next-line */ -export interface GoabAppFooterProps { +export interface GoabAppFooterProps extends DataAttributes { maxContentWidth?: string; children?: ReactNode; testId?: string; @@ -27,13 +29,13 @@ export interface GoabAppFooterProps { export type FooterProps = GoabAppFooterProps; export function GoabAppFooter({ - maxContentWidth, children, - testId, - url, + ...rest }: GoabAppFooterProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/form-item/form-item.spec.tsx b/libs/react-components/src/lib/form-item/form-item.spec.tsx index ff2132215c..94a8e70746 100644 --- a/libs/react-components/src/lib/form-item/form-item.spec.tsx +++ b/libs/react-components/src/lib/form-item/form-item.spec.tsx @@ -55,4 +55,17 @@ describe("GoaFormItem", () => { expect(el?.getAttribute("name")).toEqual("first_name"); expect(el?.getAttribute("public-form-summary-order")).toEqual("2"); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Form content + + ); + const el = baseElement.querySelector("goa-form-item"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/form-item/form-item.tsx b/libs/react-components/src/lib/form-item/form-item.tsx index 60f4b7b2f9..6581bfc7b5 100644 --- a/libs/react-components/src/lib/form-item/form-item.tsx +++ b/libs/react-components/src/lib/form-item/form-item.tsx @@ -1,10 +1,11 @@ import { GoabFormItemLabelSize, GoabFormItemRequirement, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import type { JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { label?: string; @@ -28,7 +29,7 @@ declare module "react" { } } -export interface GoabFormItemProps extends Margins { +export interface GoabFormItemProps extends Margins, DataAttributes { label?: string; labelSize?: GoabFormItemLabelSize; requirement?: GoabFormItemRequirement; @@ -49,38 +50,20 @@ export interface GoabFormItemProps extends Margins { } export function GoabFormItem({ - children, - helpText, error, - requirement, - label, - labelSize, - maxWidth, + helpText, publicFormSummaryOrder, - name, - mt, - mr, - mb, - ml, - testId, - id, + children, + ...rest }: GoabFormItemProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( {error && typeof error !== "string" &&
{error}
} {helpText && typeof helpText !== "string" &&
{helpText}
} diff --git a/libs/react-components/src/lib/form/fieldset.spec.tsx b/libs/react-components/src/lib/form/fieldset.spec.tsx index 41b0ec9408..df8faa3acc 100644 --- a/libs/react-components/src/lib/form/fieldset.spec.tsx +++ b/libs/react-components/src/lib/form/fieldset.spec.tsx @@ -80,4 +80,16 @@ describe("GoabFieldset", () => { expect(handleContinue).not.toHaveBeenCalled(); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-fieldset"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/form/fieldset.tsx b/libs/react-components/src/lib/form/fieldset.tsx index 1a4b06ba89..3710714c17 100644 --- a/libs/react-components/src/lib/form/fieldset.tsx +++ b/libs/react-components/src/lib/form/fieldset.tsx @@ -1,11 +1,12 @@ -import { ReactNode, useEffect, useRef } from "react"; +import { ReactNode, useEffect, useRef, type JSX } from "react"; import { + DataAttributes, GoabFieldsetOnContinueDetail, GoabFormDispatchOn, } from "@abgov/ui-components-common"; +import { transformProps, kebab } from "../common/extract-props"; interface WCProps { - ref?: React.RefObject; id?: string; "section-title"?: string; "dispatch-on"?: string; @@ -15,12 +16,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-fieldset": WCProps & React.HTMLAttributes; + "goa-fieldset": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -interface GoabFieldsetProps { +interface GoabFieldsetProps extends DataAttributes { id?: string; sectionTitle?: string; dispatchOn?: GoabFormDispatchOn; @@ -29,15 +32,14 @@ interface GoabFieldsetProps { } export function GoabFieldset({ - id, - sectionTitle, - dispatchOn, onContinue, children, - -}: GoabFieldsetProps) { + ...rest +}: GoabFieldsetProps): JSX.Element { const ref = useRef(null); + const _props = transformProps(rest, kebab); + useEffect(() => { if (!ref.current) return; const current = ref.current; @@ -59,12 +61,7 @@ export function GoabFieldset({ }, [ref, onContinue]); return ( - + {children} ); diff --git a/libs/react-components/src/lib/form/public-form-page.spec.tsx b/libs/react-components/src/lib/form/public-form-page.spec.tsx index 9059db881d..97463b9b77 100644 --- a/libs/react-components/src/lib/form/public-form-page.spec.tsx +++ b/libs/react-components/src/lib/form/public-form-page.spec.tsx @@ -108,4 +108,16 @@ describe("GoabPublicFormPage", () => { expect(handleContinue).not.toHaveBeenCalled(); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-public-form-page"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/form/public-form-page.tsx b/libs/react-components/src/lib/form/public-form-page.tsx index 1e2686a8f8..1c38ccfe2f 100644 --- a/libs/react-components/src/lib/form/public-form-page.tsx +++ b/libs/react-components/src/lib/form/public-form-page.tsx @@ -2,11 +2,11 @@ import { ReactNode, useEffect, useRef } from "react"; import { GoabPublicFormPageButtonVisibility, GoabPublicFormPageStep, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, kebab } from "../common/extract-props"; interface WCProps extends Margins { - ref?: React.RefObject; id?: string; heading?: string; "sub-heading"?: string; @@ -22,12 +22,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-public-form-page": WCProps & React.HTMLAttributes; + "goa-public-form-page": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -interface GoabPublicFormPageProps extends Margins { +interface GoabPublicFormPageProps extends Margins, DataAttributes { id?: string; heading?: string; subHeading?: string; @@ -46,24 +48,14 @@ interface GoabPublicFormPageProps extends Margins { } export function GoabPublicFormPage({ - id = "", - heading = "", - subHeading = "", - summaryHeading = "", - sectionTitle = "", - backUrl = "", - type = "step", - buttonText = "", - buttonVisibility = "visible", onContinue, children, - mt, - mr, - mb, - ml, + ...rest }: GoabPublicFormPageProps) { const ref = useRef(null); + const _props = transformProps(rest, kebab); + useEffect(() => { if (!ref.current) return; const current = ref.current; @@ -84,22 +76,7 @@ export function GoabPublicFormPage({ }, [ref, onContinue]); return ( - + {children} ); diff --git a/libs/react-components/src/lib/form/public-form-summary.spec.tsx b/libs/react-components/src/lib/form/public-form-summary.spec.tsx index e4e6138622..2af53223ba 100644 --- a/libs/react-components/src/lib/form/public-form-summary.spec.tsx +++ b/libs/react-components/src/lib/form/public-form-summary.spec.tsx @@ -23,4 +23,15 @@ describe("GoabPublicFormSummary", () => { expect(el).toBeTruthy(); expect(el?.getAttribute("heading")).toBe(heading); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + ); + const el = baseElement.querySelector("goa-public-form-summary"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/form/public-form-summary.tsx b/libs/react-components/src/lib/form/public-form-summary.tsx index 396255bb00..3342095940 100644 --- a/libs/react-components/src/lib/form/public-form-summary.tsx +++ b/libs/react-components/src/lib/form/public-form-summary.tsx @@ -1,7 +1,7 @@ -import { useRef } from "react"; +import { DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { - ref?: React.RefObject; heading?: string; } @@ -14,21 +14,21 @@ declare module "react" { } } -interface GoabPublicFormSummaryProps { +interface GoabPublicFormSummaryProps extends DataAttributes { heading?: string; } export function GoabPublicFormSummary({ heading = "", + ...rest }: GoabPublicFormSummaryProps) { - const ref = useRef(null); + const _props = transformProps( + { heading, ...rest }, + lowercase + ); return ( - - + ); } diff --git a/libs/react-components/src/lib/form/public-form.spec.tsx b/libs/react-components/src/lib/form/public-form.spec.tsx index 4f8562393d..c146dd2c59 100644 --- a/libs/react-components/src/lib/form/public-form.spec.tsx +++ b/libs/react-components/src/lib/form/public-form.spec.tsx @@ -133,4 +133,17 @@ describe("GoabPublicForm", () => { expect(handleComplete).not.toHaveBeenCalled(); expect(handleStateChange).not.toHaveBeenCalled(); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-public-form"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/form/public-form.tsx b/libs/react-components/src/lib/form/public-form.tsx index 8da4ebbe78..3a81fa3054 100644 --- a/libs/react-components/src/lib/form/public-form.tsx +++ b/libs/react-components/src/lib/form/public-form.tsx @@ -1,12 +1,13 @@ import { ReactNode, useRef, useLayoutEffect } from "react"; import { + DataAttributes, GoabFormState, GoabPublicFormStatus, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { - ref?: React.RefObject; status?: string; name?: string; } @@ -15,12 +16,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-public-form": WCProps & React.HTMLAttributes; + "goa-public-form": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -interface GoabPublicFormProps { +interface GoabPublicFormProps extends DataAttributes { status?: GoabPublicFormStatus; name?: string; onInit?: (event: Event) => void; @@ -30,16 +33,17 @@ interface GoabPublicFormProps { } export function GoabPublicForm({ - status = "complete", - name, onInit, onComplete, onStateChange, children, + ...rest }: GoabPublicFormProps) { const ref = useRef(null); const initialized = useRef(false); + const _props = transformProps(rest, lowercase); + // Use useLayoutEffect to set up listeners before the component mounts useLayoutEffect(() => { if (!ref.current) return; @@ -86,11 +90,7 @@ export function GoabPublicForm({ }, [onInit, onComplete, onStateChange]); return ( - + {children} ); diff --git a/libs/react-components/src/lib/form/public-subform-index.spec.tsx b/libs/react-components/src/lib/form/public-subform-index.spec.tsx index bc1f5fde04..9f792d4938 100644 --- a/libs/react-components/src/lib/form/public-subform-index.spec.tsx +++ b/libs/react-components/src/lib/form/public-subform-index.spec.tsx @@ -169,4 +169,17 @@ describe("GoabPublicSubformIndex", () => { expect(baseElement.querySelector("[data-testid='task-item-2']")).toBeTruthy(); expect(baseElement.querySelectorAll("button")).toHaveLength(2); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-public-subform-index"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/form/public-subform-index.tsx b/libs/react-components/src/lib/form/public-subform-index.tsx index 6f9a76d240..b540c7677b 100644 --- a/libs/react-components/src/lib/form/public-subform-index.tsx +++ b/libs/react-components/src/lib/form/public-subform-index.tsx @@ -1,8 +1,8 @@ -import { ReactNode, useRef } from "react"; -import { Margins } from "@abgov/ui-components-common"; +import { ReactNode } from "react"; +import { Margins, DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, kebab } from "../common/extract-props"; interface WCProps extends Margins { - ref?: React.RefObject; heading?: string; "section-title"?: string; "action-button-text"?: string; @@ -18,7 +18,7 @@ declare module "react" { } } -interface GoabPublicSubformIndexProps extends Margins { +interface GoabPublicSubformIndexProps extends Margins, DataAttributes { heading?: string; sectionTitle?: string; actionButtonText?: string; @@ -32,26 +32,15 @@ export function GoabPublicSubformIndex({ actionButtonText = "", buttonVisibility = "hidden", children, - mt, - mr, - mb, - ml, + ...rest }: GoabPublicSubformIndexProps) { - const ref = useRef(null); + const _props = transformProps( + { heading, "section-title": sectionTitle, "action-button-text": actionButtonText, "button-visibility": buttonVisibility, ...rest }, + kebab + ); return ( - + {children} ); diff --git a/libs/react-components/src/lib/form/public-subform.spec.tsx b/libs/react-components/src/lib/form/public-subform.spec.tsx index f8a1ac836a..f0aa1ec9ed 100644 --- a/libs/react-components/src/lib/form/public-subform.spec.tsx +++ b/libs/react-components/src/lib/form/public-subform.spec.tsx @@ -212,4 +212,17 @@ describe("GoabPublicSubform", () => { expect(baseElement.querySelectorAll("input")).toHaveLength(1); expect(baseElement.querySelectorAll("textarea")).toHaveLength(1); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-public-subform"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/form/public-subform.tsx b/libs/react-components/src/lib/form/public-subform.tsx index 4e828701d6..30b3f78e9a 100644 --- a/libs/react-components/src/lib/form/public-subform.tsx +++ b/libs/react-components/src/lib/form/public-subform.tsx @@ -1,8 +1,8 @@ import { ReactNode, useEffect, useRef } from "react"; -import { Margins } from "@abgov/ui-components-common"; +import { Margins, DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, kebab } from "../common/extract-props"; interface WCProps extends Margins { - ref?: React.RefObject; id?: string; name?: string; "continue-msg"?: string; @@ -12,12 +12,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-public-subform": WCProps & React.HTMLAttributes; + "goa-public-subform": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -interface GoabPublicSubformProps extends Margins { +interface GoabPublicSubformProps extends Margins, DataAttributes { id?: string; name?: string; continueMsg?: string; @@ -33,13 +35,15 @@ export function GoabPublicSubform({ onInit, onStateChange, children, - mt, - mr, - mb, - ml, + ...rest }: GoabPublicSubformProps) { const ref = useRef(null); + const _props = transformProps( + { id, name, "continue-msg": continueMsg, ...rest }, + kebab + ); + useEffect(() => { if (!ref.current) return; const current = ref.current; @@ -70,16 +74,7 @@ export function GoabPublicSubform({ }, [ref, onInit, onStateChange]); return ( - + {children} ); diff --git a/libs/react-components/src/lib/form/task-list.spec.tsx b/libs/react-components/src/lib/form/task-list.spec.tsx index 5a7e0a0846..072754f287 100644 --- a/libs/react-components/src/lib/form/task-list.spec.tsx +++ b/libs/react-components/src/lib/form/task-list.spec.tsx @@ -210,4 +210,17 @@ describe("GoabPublicFormTaskList", () => { expect(baseElement.querySelectorAll("h4")).toHaveLength(3); expect(baseElement.querySelectorAll("[data-testid^='task-']")).toHaveLength(6); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-public-form-task-list"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); \ No newline at end of file diff --git a/libs/react-components/src/lib/form/task-list.tsx b/libs/react-components/src/lib/form/task-list.tsx index 25de869bab..a807316834 100644 --- a/libs/react-components/src/lib/form/task-list.tsx +++ b/libs/react-components/src/lib/form/task-list.tsx @@ -1,5 +1,6 @@ import { ReactNode } from "react"; -import { Margins } from "@abgov/ui-components-common"; +import { Margins, DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { heading?: string; @@ -14,27 +15,19 @@ declare module "react" { } } -interface GoabPublicFormTaskListProps extends Margins { +interface GoabPublicFormTaskListProps extends Margins, DataAttributes { heading?: string; children: ReactNode; } export function GoabPublicFormTaskList({ - heading = "", children, - mt, - mr, - mb, - ml, + ...rest }: GoabPublicFormTaskListProps) { + const _props = transformProps(rest, lowercase); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/form/task.spec.tsx b/libs/react-components/src/lib/form/task.spec.tsx index ee4ecb03c9..bbe5eb7459 100644 --- a/libs/react-components/src/lib/form/task.spec.tsx +++ b/libs/react-components/src/lib/form/task.spec.tsx @@ -221,4 +221,17 @@ describe("GoabPublicFormTask", () => { expect(el?.getAttribute("status")).toBe("completed"); expect(el?.textContent).toBe(""); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-public-form-task"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); \ No newline at end of file diff --git a/libs/react-components/src/lib/form/task.tsx b/libs/react-components/src/lib/form/task.tsx index 928a713e48..5b833ab5ec 100644 --- a/libs/react-components/src/lib/form/task.tsx +++ b/libs/react-components/src/lib/form/task.tsx @@ -1,5 +1,6 @@ import { ReactNode } from "react"; -import { GoabPublicFormTaskStatus } from "@abgov/ui-components-common"; +import { DataAttributes, GoabPublicFormTaskStatus } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { status?: GoabPublicFormTaskStatus; @@ -14,13 +15,22 @@ declare module "react" { } } -type GoabPublicFormTaskProps = { +interface GoabPublicFormTaskProps extends DataAttributes { status?: GoabPublicFormTaskStatus; children: ReactNode; -}; +} + +export function GoabPublicFormTask({ + status = "cannot-start", + children, + ...rest +}: GoabPublicFormTaskProps) { + const _props = transformProps( + { status, ...rest }, + lowercase + ); -export function GoabPublicFormTask({ status = "cannot-start", children }: GoabPublicFormTaskProps) { - return {children}; + return {children}; } export default GoabPublicFormTask; diff --git a/libs/react-components/src/lib/icon-button/icon-button.spec.tsx b/libs/react-components/src/lib/icon-button/icon-button.spec.tsx index a413cd9635..300f135f49 100644 --- a/libs/react-components/src/lib/icon-button/icon-button.spec.tsx +++ b/libs/react-components/src/lib/icon-button/icon-button.spec.tsx @@ -49,4 +49,15 @@ describe("GoabIconButton", () => { }, ); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + ); + const el = container.querySelector("goa-icon-button"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/icon-button/icon-button.tsx b/libs/react-components/src/lib/icon-button/icon-button.tsx index e12220074e..9acdd8d430 100644 --- a/libs/react-components/src/lib/icon-button/icon-button.tsx +++ b/libs/react-components/src/lib/icon-button/icon-button.tsx @@ -2,12 +2,12 @@ import { GoabIconButtonVariant, GoabIconSize, GoabIconType, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import { useEffect, useRef, type JSX, ReactNode } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.RefObject; icon: GoabIconType; size?: GoabIconSize; variant?: GoabIconButtonVariant; @@ -24,12 +24,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-icon-button": WCProps & React.HTMLAttributes; + "goa-icon-button": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabIconButtonProps extends Margins { +export interface GoabIconButtonProps extends Margins, DataAttributes { icon: GoabIconType; size?: GoabIconSize; variant?: GoabIconButtonVariant; @@ -45,24 +47,22 @@ export interface GoabIconButtonProps extends Margins { } export function GoabIconButton({ - icon, - disabled, variant = "color", - onClick, size = "medium", - title, - ariaLabel, - testId, - children, - mt, - mr, - mb, - ml, - action, + disabled, + onClick, actionArgs, actionArg, + children, + ...rest }: GoabIconButtonProps): JSX.Element { const ref = useRef(null); + + const _props = transformProps( + { variant, size, ...rest }, + lowercase + ); + useEffect(() => { if (!ref.current) { return; @@ -72,7 +72,7 @@ export function GoabIconButton({ } const current = ref.current; const listener = () => { - onClick(); + onClick?.(); }; current.addEventListener("_click", listener); @@ -84,20 +84,10 @@ export function GoabIconButton({ return ( {children} diff --git a/libs/react-components/src/lib/icon/icon.spec.tsx b/libs/react-components/src/lib/icon/icon.spec.tsx index 187e704296..5819fc7523 100644 --- a/libs/react-components/src/lib/icon/icon.spec.tsx +++ b/libs/react-components/src/lib/icon/icon.spec.tsx @@ -44,4 +44,15 @@ describe("GoabIcon", () => { expect(el?.getAttribute("mb")).toBe("l"); expect(el?.getAttribute("ml")).toBe("xl"); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + ); + const el = container.querySelector("goa-icon"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/icon/icon.tsx b/libs/react-components/src/lib/icon/icon.tsx index 5f9c3e3409..da54f65acd 100644 --- a/libs/react-components/src/lib/icon/icon.tsx +++ b/libs/react-components/src/lib/icon/icon.tsx @@ -1,30 +1,17 @@ import { - GoabIconFilledType, GoabIconOverridesType, GoabIconSize, GoabIconTheme, GoabIconType, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import type { JSX } from "react"; - -interface IonIconProps { - name: GoabIconType | GoabIconFilledType; -} +import { transformProps, lowercase } from "../common/extract-props"; // eslint-disable-next-line @typescript-eslint/no-empty-interface interface IonIconElement extends HTMLElement {} -declare module "react" { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace JSX { - interface IntrinsicElements { - "ion-icon": IonIconProps & React.HTMLAttributes; - } - } -} - declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { @@ -34,7 +21,7 @@ declare module "react" { } } -export interface GoabIconProps extends Margins { +export interface GoabIconProps extends Margins, DataAttributes { type: GoabIconType | GoabIconOverridesType; size?: GoabIconSize; theme?: GoabIconTheme; @@ -59,37 +46,17 @@ interface WCProps extends Margins { } export function GoabIcon({ - type, - theme, - size, - inverted, // TODO: change to boolean only - fillColor, - opacity, - title, - ariaLabel, - mt, - mr, - mb, - ml, - testId, + inverted, + ...rest }: GoabIconProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( ); -} \ No newline at end of file +} diff --git a/libs/react-components/src/lib/input/input.spec.tsx b/libs/react-components/src/lib/input/input.spec.tsx index 79dd67fd50..14d57349a0 100644 --- a/libs/react-components/src/lib/input/input.spec.tsx +++ b/libs/react-components/src/lib/input/input.spec.tsx @@ -149,10 +149,13 @@ describe("Input", () => { inputElement, new CustomEvent("_change", { detail: { name: "dateInput", value: newDate } }), ); - expect(mockOnChangeHandler).toBeCalledWith({ - name: "dateInput", - value: new Date(newDate), - }); + expect(mockOnChangeHandler).toBeCalledWith( + expect.objectContaining({ + name: "dateInput", + value: new Date(newDate), + event: expect.any(Event), + }), + ); }); it("should handle decimal number for GoabInputNumber", () => { @@ -171,10 +174,13 @@ describe("Input", () => { detail: { name: "numberInput", value: decimalValue }, }), ); - expect(mockOnChangeHandler).toBeCalledWith({ - name: "numberInput", - value: decimalValue, - }); + expect(mockOnChangeHandler).toBeCalledWith( + expect.objectContaining({ + name: "numberInput", + value: decimalValue, + event: expect.any(Event), + }), + ); }); describe("Text Alignment", () => { @@ -192,4 +198,16 @@ describe("Input", () => { expect(input?.getAttribute("textalign")).toBe("right"); }); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + ); + const el = container.querySelector("goa-input"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/input/input.tsx b/libs/react-components/src/lib/input/input.tsx index 14d878fad4..882a4d498a 100644 --- a/libs/react-components/src/lib/input/input.tsx +++ b/libs/react-components/src/lib/input/input.tsx @@ -9,15 +9,15 @@ import { GoabInputOnFocusDetail, GoabInputOnKeyPressDetail, GoabInputType, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; export interface IgnoreMe { ignore: string; } interface WCProps extends Margins { - ref?: React.RefObject; type?: GoabInputType; name: string; value?: string; @@ -54,12 +54,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-input": WCProps & React.HTMLAttributes; + "goa-input": WCProps & React.HTMLAttributes & { + ref?: React.RefObject; + }; } } } -interface BaseProps extends Margins { +interface BaseProps extends Margins, DataAttributes { // required name: string; @@ -128,45 +130,25 @@ interface GoabDateInputProps extends BaseProps { } export function GoabInput({ - id, - debounce, - name, - type, - autoCapitalize, - autoComplete, - leadingIcon, - trailingIcon, variant = "goa", + textAlign = "left", focused, disabled, readonly, - value, - placeholder, error, - width, - testId, - min, - max, - step, - prefix, - suffix, - ariaLabel, - mt, - mr, - mb, - ml, leadingContent, trailingContent, - maxLength, - trailingIconAriaLabel, - textAlign = "left", onTrailingIconClick, onChange, onFocus, onBlur, onKeyPress, + ...rest }: GoabInputProps & { type?: GoabInputType }): JSX.Element { const ref = useRef(null); + + const _props = transformProps({ variant, textalign: textAlign, ...rest }, lowercase); + useEffect(() => { if (!ref.current) { return; @@ -174,7 +156,7 @@ export function GoabInput({ const current = ref.current; const changeListener = (e: Event) => { const detail = (e as CustomEvent).detail; - onChange?.(detail); + onChange?.({ ...detail, event: e }); }; const clickListener = () => { onTrailingIconClick?.(); @@ -182,17 +164,17 @@ export function GoabInput({ const focusListener = (e: Event) => { const detail = (e as CustomEvent).detail; - onFocus?.(detail); + onFocus?.({ ...detail, event: e }); }; const blurListener = (e: Event) => { const detail = (e as CustomEvent).detail; - onBlur?.(detail); + onBlur?.({ ...detail, event: e }); }; const keypressListener = (e: Event) => { const detail = (e as CustomEvent).detail; - onKeyPress?.(detail); + onKeyPress?.({ ...detail, event: e }); }; current.addEventListener("_change", changeListener); @@ -213,37 +195,12 @@ export function GoabInput({ return ( {leadingContent &&
{leadingContent}
} {trailingContent &&
{trailingContent}
} @@ -252,31 +209,31 @@ export function GoabInput({ } const onDateChangeHandler = (onChange?: OnChange) => { - return ({ name, value }: GoabInputOnChangeDetail) => { + return ({ name, value, event }: GoabInputOnChangeDetail) => { if (!value) { - onChange?.({ name, value: "" }); + onChange?.({ name, value: "", event }); return; } // valid string date if (typeof value === "string" && isValid(new Date(value))) { - onChange?.({ name, value: parseISO(value) }); + onChange?.({ name, value: parseISO(value), event }); return; } // valid date if (isValid(value)) { - onChange?.({ name, value }); + onChange?.({ name, value, event }); return; } }; }; const onTimeChangeHandler = (onChange?: OnChange) => { - return ({ name, value }: GoabInputOnChangeDetail) => { + return ({ name, value, event }: GoabInputOnChangeDetail) => { if (!value) { - onChange?.({ name, value: "" }); + onChange?.({ name, value: "", event }); return; } - onChange?.({ name, value }); + onChange?.({ name, value, event }); }; }; @@ -373,7 +330,13 @@ export function GoabInputFile(props: GoabInputProps): JSX.Element { id={props.id} name={props.name} type="file" - onChange={(e) => props.onChange?.({ name: e.target.name, value: e.target.value })} + onChange={(e) => + props.onChange?.({ + name: e.target.name, + value: e.target.value, + event: e.nativeEvent, + }) + } style={{ backgroundColor: "revert" }} /> ); @@ -390,17 +353,17 @@ export function GoabInputNumber({ textAlign = "right", ...props }: GoabNumberInputProps): JSX.Element { - const onNumberChange = ({ name, value }: GoabInputOnChangeDetail) => { - props.onChange?.({ name, value: parseFloat(value) }); + const onNumberChange = ({ name, value, event }: GoabInputOnChangeDetail) => { + props.onChange?.({ name, value: parseFloat(value), event }); }; - const onFocus = ({ name, value }: GoabInputOnFocusDetail) => { - props.onFocus?.({ name, value: parseFloat(value) }); + const onFocus = ({ name, value, event }: GoabInputOnFocusDetail) => { + props.onFocus?.({ name, value: parseFloat(value), event }); }; - const onBlur = ({ name, value }: GoabInputOnBlurDetail) => { - props.onBlur?.({ name, value: parseFloat(value) }); + const onBlur = ({ name, value, event }: GoabInputOnBlurDetail) => { + props.onBlur?.({ name, value: parseFloat(value), event }); }; - const onKeyPress = ({ name, value, key }: GoabInputOnKeyPressDetail) => { - props.onKeyPress?.({ name, value: parseFloat(value), key: parseInt(key) }); + const onKeyPress = ({ name, value, key, event }: GoabInputOnKeyPressDetail) => { + props.onKeyPress?.({ name, value: parseFloat(value), key: parseInt(key), event }); }; return ( { + it("renders a goa-linear-progress", async () => { + const { container } = render(); + const el = container.querySelector("goa-linear-progress"); + await waitFor(() => { + expect(el).toBeTruthy(); + }); + }); + + it("passes the prop attribute values correctly", async () => { + const testId = "linear-progress-test-id"; + const progress = 75; + const ariaLabel = "label area"; + const ariaLabelledBy = "by area labelled"; + (["visible", "hidden", undefined] as const).forEach(async (percentVisibility) => { + const { container } = render( + , + ); + const el = container.querySelector("goa-linear-progress"); + await waitFor(() => { + expect(el?.getAttribute("testid")).toBe(testId); + expect(el?.getAttribute("progress")).toBe(progress.toString()); + expect(el?.getAttribute("percent-visibility")).toBe(percentVisibility); + expect(el?.getAttribute("aria-label")).toBe(ariaLabel); + expect(el?.getAttribute("aria-labelledby")).toBe(ariaLabelledBy); + }); + }); + }); +}); diff --git a/libs/react-components/src/lib/linear-progress/linear-progress.tsx b/libs/react-components/src/lib/linear-progress/linear-progress.tsx new file mode 100644 index 0000000000..2c689e4c89 --- /dev/null +++ b/libs/react-components/src/lib/linear-progress/linear-progress.tsx @@ -0,0 +1,44 @@ +interface WCProps { + testid?: string; + progress?: number | null; + percentVisibility?: "visible" | "hidden" | undefined; + ariaLabel?: string; + ariaLabelledBy?: string; +} + +declare module "react" { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace JSX { + interface IntrinsicElements { + "goa-linear-progress": WCProps & React.HTMLAttributes; + } + } +} + +export interface GoabLinearProgressProps { + progress?: number | null; + percentVisibility?: "visible" | "hidden" | undefined; + ariaLabel?: string; + ariaLabelledBy?: string; + testId?: string; +} + +export const GoabLinearProgress = ({ + progress, + percentVisibility, + ariaLabel, + ariaLabelledBy, + testId, +}: GoabLinearProgressProps) => { + return ( + + ); +}; + +export default GoabLinearProgress; diff --git a/libs/react-components/src/lib/link-button/link-button.tsx b/libs/react-components/src/lib/link-button/link-button.tsx index 621d99ca2e..2322fce437 100644 --- a/libs/react-components/src/lib/link-button/link-button.tsx +++ b/libs/react-components/src/lib/link-button/link-button.tsx @@ -1,5 +1,6 @@ import { ReactNode } from "react"; -import { GoabIconType, GoabLinkButtonType, Margins } from "@abgov/ui-components-common"; +import { DataAttributes, GoabIconType, GoabLinkButtonType, Margins } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { type?: GoabLinkButtonType; @@ -16,25 +17,26 @@ declare module "react" { } } -interface GoALinkButtonProps extends Margins { +interface GoALinkButtonProps extends Margins, DataAttributes { type?: GoabLinkButtonType; leadingIcon?: GoabIconType; trailingIcon?: GoabIconType; children: ReactNode; } -export function GoALinkButton({ type = "primary", ...props }: GoALinkButtonProps) { +export function GoALinkButton({ + type = "primary", + children, + ...rest +}: GoALinkButtonProps) { + const _props = transformProps( + { type, ...rest }, + lowercase + ); + return ( - - {props.children} + + {children} ); } diff --git a/libs/react-components/src/lib/link/link.spec.tsx b/libs/react-components/src/lib/link/link.spec.tsx index dba49d3598..98565c26aa 100644 --- a/libs/react-components/src/lib/link/link.spec.tsx +++ b/libs/react-components/src/lib/link/link.spec.tsx @@ -1,6 +1,5 @@ import { configure, render } from "@testing-library/react"; import { GoabLink } from "./link"; -import { screen } from "@testing-library/dom"; configure({ testIdAttribute: "testId", @@ -36,4 +35,14 @@ describe("GoabLink", () => { expect(link).toBeTruthy(); expect(link?.getAttribute("href")).toBe("https://example.com"); }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + Test link + + ); + const el = container.querySelector("goa-link"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/link/link.tsx b/libs/react-components/src/lib/link/link.tsx index 7a938bf05a..e931320217 100644 --- a/libs/react-components/src/lib/link/link.tsx +++ b/libs/react-components/src/lib/link/link.tsx @@ -1,5 +1,6 @@ import { ReactNode } from "react"; -import { GoabIconType, Margins } from "@abgov/ui-components-common"; +import { GoabIconType, Margins, DataAttributes } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { leadingicon?: GoabIconType; @@ -19,7 +20,7 @@ declare module "react" { } } -interface GoabLinkProps extends Margins { +interface GoabLinkProps extends Margins, DataAttributes { leadingIcon?: GoabIconType; trailingIcon?: GoabIconType; action?: string; @@ -29,21 +30,21 @@ interface GoabLinkProps extends Margins { children: ReactNode; } -export function GoabLink(props: GoabLinkProps) { +export function GoabLink({ + actionArgs, + actionArg, + children, + ...rest +}: GoabLinkProps) { + const _props = transformProps(rest, lowercase); + return ( - {props.children} + {children} ); } diff --git a/libs/react-components/src/lib/menu-button/menu-action.tsx b/libs/react-components/src/lib/menu-button/menu-action.tsx index 3efea9e0db..6277d2c3ff 100644 --- a/libs/react-components/src/lib/menu-button/menu-action.tsx +++ b/libs/react-components/src/lib/menu-button/menu-action.tsx @@ -1,5 +1,6 @@ -import { GoabIconType } from "@abgov/ui-components-common"; +import { DataAttributes, GoabIconType } from "@abgov/ui-components-common"; import type { JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { text: string; @@ -17,16 +18,18 @@ declare module "react" { } } -export interface GoabMenuActionProps { +export interface GoabMenuActionProps extends DataAttributes { text: string; action: string; icon?: GoabIconType; testId?: string; } -export function GoabMenuAction({ text, icon, action, testId }: GoabMenuActionProps): JSX.Element { +export function GoabMenuAction(props: GoabMenuActionProps): JSX.Element { + const _props = transformProps(props, lowercase); + return ( - + ); } diff --git a/libs/react-components/src/lib/menu-button/menu-button.tsx b/libs/react-components/src/lib/menu-button/menu-button.tsx index 50a853b54e..5caebd48d4 100644 --- a/libs/react-components/src/lib/menu-button/menu-button.tsx +++ b/libs/react-components/src/lib/menu-button/menu-button.tsx @@ -6,8 +6,9 @@ * It also includes TypeScript interfaces for improved type checking and development experience. */ -import { GoabButtonType, GoabMenuButtonOnActionDetail } from "@abgov/ui-components-common"; +import { DataAttributes, GoabButtonType, GoabIconType, GoabMenuButtonOnActionDetail } from "@abgov/ui-components-common"; import { ReactNode, type JSX, useRef, useEffect } from "react"; +import { transformProps, kebab } from "../common/extract-props"; /** * Props definition for the `goab-menu-button` Web Component. @@ -15,12 +16,15 @@ import { ReactNode, type JSX, useRef, useEffect } from "react"; * * @property {string} text - The text label to be displayed on the button. * @property {GoabButtonType} type - The button type, e.g., "primary", "secondary", etc. + * @property {GoaIconType} leadingIcon - Optional leading icon appearing within the button. * @property {string} [testid] - A test identifier for automated testing purposes. * @property {React.RefObject} ref - A reference object pointing to the Web Component's DOM element. */ interface WCProps { text: string; type: GoabButtonType; + "max-width"?: string, + "leading-icon"?: GoabIconType; testid?: string; ref: React.RefObject; } @@ -45,13 +49,16 @@ declare module "react" { * * @property {string} text - The text label to display on the button. * @property {GoabButtonType} [type="primary"] - The button type, e.g., "primary", "secondary". Defaults to "primary". + * @property {GoaIconType} leadingIcon - Optional leading icon appearing within the button. * @property {string} [testId] - A test identifier for automated testing purposes. * @property {Function} [onAction] - Callback function invoked when an action event is emitted by the component. * @property {ReactNode} [children] - Optional child elements to be rendered inside the button. */ -export interface GoabMenuButtonProps { +export interface GoabMenuButtonProps extends DataAttributes { text: string; type?: GoabButtonType; + maxWidth?: string; + leadingIcon?: GoabIconType; testId?: string; onAction?: (detail: GoabMenuButtonOnActionDetail) => void; children?: ReactNode; @@ -81,14 +88,19 @@ export interface GoabMenuButtonProps { * ``` */ export function GoabMenuButton({ - text, type = "primary", testId, onAction, children, + ...rest }: GoabMenuButtonProps): JSX.Element { const el = useRef(null); + const _props = transformProps( + { type, testid: testId, ...rest }, + kebab + ); + useEffect(() => { if (!el.current) { return; @@ -101,7 +113,7 @@ export function GoabMenuButton({ // Event listener for the "_action" event emitted by the Web Component. const listener = (e: Event) => { const detail = (e as CustomEvent).detail as GoabMenuButtonOnActionDetail; - onAction(detail); + onAction?.(detail); }; current.addEventListener("_action", listener); @@ -111,7 +123,7 @@ export function GoabMenuButton({ }, [el, onAction]); return ( - + {children} ); diff --git a/libs/react-components/src/lib/popover/popover.spec.tsx b/libs/react-components/src/lib/popover/popover.spec.tsx index d940b5acb9..8a0b95e1e0 100644 --- a/libs/react-components/src/lib/popover/popover.spec.tsx +++ b/libs/react-components/src/lib/popover/popover.spec.tsx @@ -31,4 +31,17 @@ describe("Popover", () => { expect(el?.getAttribute("minwidth")).toBe("100px"); expect(el?.getAttribute("padded")).toBe("true"); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + +
Test content
+
+ ); + const el = baseElement.querySelector("goa-popover"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/popover/popover.tsx b/libs/react-components/src/lib/popover/popover.tsx index b8ccb4323a..3ef083d05b 100644 --- a/libs/react-components/src/lib/popover/popover.tsx +++ b/libs/react-components/src/lib/popover/popover.tsx @@ -1,5 +1,6 @@ -import { GoabPopoverPosition, Margins } from "@abgov/ui-components-common"; +import { DataAttributes, GoabPopoverPosition, Margins } from "@abgov/ui-components-common"; import { ReactNode, type JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { maxwidth?: string; @@ -19,7 +20,7 @@ declare module "react" { } } -export interface GoabPopoverProps extends Margins { +export interface GoabPopoverProps extends Margins, DataAttributes { target?: ReactNode; testId?: string; maxWidth?: string; @@ -35,30 +36,18 @@ export interface GoabPopoverProps extends Margins { export function GoabPopover({ target, - testId, - maxWidth, - minWidth, padded, - position, relative, children, - mt, - mr, - mb, - ml, + ...rest }: GoabPopoverProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( {children} {target &&
{target}
} diff --git a/libs/react-components/src/lib/radio-group/radio-group.spec.tsx b/libs/react-components/src/lib/radio-group/radio-group.spec.tsx index 56cd055327..06f7df6848 100644 --- a/libs/react-components/src/lib/radio-group/radio-group.spec.tsx +++ b/libs/react-components/src/lib/radio-group/radio-group.spec.tsx @@ -269,4 +269,18 @@ describe("RadioGroup", () => { expect(onChange).toBeCalled(); }); }); + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Apples + + ); + const el = baseElement.querySelector("goa-radio-group"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/radio-group/radio-group.tsx b/libs/react-components/src/lib/radio-group/radio-group.tsx index 3fcdaa63cc..ea573e5097 100644 --- a/libs/react-components/src/lib/radio-group/radio-group.tsx +++ b/libs/react-components/src/lib/radio-group/radio-group.tsx @@ -2,13 +2,13 @@ import { useEffect, useRef, type JSX } from "react"; import { GoabRadioGroupOnChangeDetail, GoabRadioGroupOrientation, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; export * from "./radio"; interface WCProps extends Margins { - ref: React.RefObject; name: string; value?: string; id?: string; @@ -23,12 +23,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-radio-group": WCProps & React.HTMLAttributes; + "goa-radio-group": WCProps & React.HTMLAttributes & { + ref: React.RefObject; + }; } } } -export interface GoabRadioGroupProps extends Margins { +export interface GoabRadioGroupProps extends Margins, DataAttributes { name: string; value?: string; id?: string; @@ -42,29 +44,23 @@ export interface GoabRadioGroupProps extends Margins { } export function GoabRadioGroup({ - name, - value, - children, - orientation, disabled, error, - id, - testId, - ariaLabel, - mt, - mr, - mb, - ml, onChange, + name, + children, + ...rest }: GoabRadioGroupProps): JSX.Element { const el = useRef(null); + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) return; const listener = (e: Event) => { const detail = (e as CustomEvent).detail; - onChange?.(detail); + onChange?.({ ...detail, event: e }); }; const currentEl = el.current; @@ -81,19 +77,11 @@ export function GoabRadioGroup({ return ( {children} diff --git a/libs/react-components/src/lib/tab/tab.spec.tsx b/libs/react-components/src/lib/tab/tab.spec.tsx index c54598e549..d6484a3b27 100644 --- a/libs/react-components/src/lib/tab/tab.spec.tsx +++ b/libs/react-components/src/lib/tab/tab.spec.tsx @@ -17,4 +17,37 @@ describe("GoabTab", () => { const content = container.querySelector("p"); expect(content?.innerHTML).toContain("Lorem ipsum dolor sit amet"); }); + + it("should render with disabled attribute when disabled is true", () => { + const { container } = render( + +

Disabled content

+
, + ); + const tab = container.querySelector("goa-tab"); + expect(tab).toBeTruthy(); + expect(tab?.getAttribute("disabled")).toBe("true"); + }); + + it("should not have disabled attribute when disabled is false", () => { + const { container } = render( + +

Enabled content

+
, + ); + const tab = container.querySelector("goa-tab"); + expect(tab).toBeTruthy(); + expect(tab?.getAttribute("disabled")).toBeNull(); + }); + + it("should not have disabled attribute when disabled is not provided", () => { + const { container } = render( + +

Default content

+
, + ); + const tab = container.querySelector("goa-tab"); + expect(tab).toBeTruthy(); + expect(tab?.getAttribute("disabled")).toBeNull(); + }); }); diff --git a/libs/react-components/src/lib/tab/tab.tsx b/libs/react-components/src/lib/tab/tab.tsx index 5ffa248c11..08b94c06b1 100644 --- a/libs/react-components/src/lib/tab/tab.tsx +++ b/libs/react-components/src/lib/tab/tab.tsx @@ -1,6 +1,7 @@ import type { JSX } from "react"; interface WCProps { heading?: React.ReactNode; + disabled?: string; } declare module "react" { @@ -14,12 +15,13 @@ declare module "react" { export interface GoabTabItemProps { heading?: React.ReactNode; + disabled?: boolean; children?: React.ReactNode; } -export function GoabTab({ heading, children }: GoabTabItemProps): JSX.Element { +export function GoabTab({ heading, disabled, children }: GoabTabItemProps): JSX.Element { return ( - + {heading && {heading}} {children} diff --git a/libs/react-components/src/lib/table/table-sort-header.spec.tsx b/libs/react-components/src/lib/table/table-sort-header.spec.tsx index 90efddf06a..ec7c9803c4 100644 --- a/libs/react-components/src/lib/table/table-sort-header.spec.tsx +++ b/libs/react-components/src/lib/table/table-sort-header.spec.tsx @@ -13,4 +13,10 @@ describe("GoabTableSortHeader", () => { const el = document.querySelector("goa-table-sort-header"); expect(el?.getAttribute("direction")).toBe("asc"); }); + + it("should pass data-grid attributes", () => { + render(); + const el = document.querySelector("goa-table-sort-header"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/table/table-sort-header.tsx b/libs/react-components/src/lib/table/table-sort-header.tsx index f7e06d4366..0323208389 100644 --- a/libs/react-components/src/lib/table/table-sort-header.tsx +++ b/libs/react-components/src/lib/table/table-sort-header.tsx @@ -1,6 +1,7 @@ -import { GoabTableSortDirection } from "@abgov/ui-components-common"; +import { DataAttributes, GoabTableSortDirection } from "@abgov/ui-components-common"; import type { JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps { name?: string; @@ -17,19 +18,20 @@ declare module "react" { } /* eslint-disable-next-line */ -export interface GoabTableSortProps { +export interface GoabTableSortProps extends DataAttributes { name?: string; direction?: GoabTableSortDirection; children?: React.ReactNode; } export function GoabTableSortHeader({ - name, - direction = "none", children, + ...rest }: GoabTableSortProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( - + {children} ); diff --git a/libs/react-components/src/lib/tabs/tabs.spec.tsx b/libs/react-components/src/lib/tabs/tabs.spec.tsx index 775c55d818..9c8bbeff8a 100644 --- a/libs/react-components/src/lib/tabs/tabs.spec.tsx +++ b/libs/react-components/src/lib/tabs/tabs.spec.tsx @@ -5,7 +5,7 @@ import GoabTabs from "./tabs"; describe("Tabs", () => { it("should render successfully", () => { const { baseElement } = render( - +

Profile: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed @@ -22,4 +22,40 @@ describe("Tabs", () => { const tabElements = baseElement.querySelectorAll("goa-tab"); expect(tabElements.length).toBe(1); }); + + it("should render with variant='segmented'", () => { + const { baseElement } = render( + + Content 1 + Content 2 + , + ); + const el = baseElement.querySelector("goa-tabs"); + expect(el).toBeTruthy(); + expect(el?.getAttribute("variant")).toBe("segmented"); + }); + + it("should render with variant='default'", () => { + const { baseElement } = render( + + Content 1 + Content 2 + , + ); + const el = baseElement.querySelector("goa-tabs"); + expect(el).toBeTruthy(); + expect(el?.getAttribute("variant")).toBe("default"); + }); + + it("should not have variant attribute when variant is not provided", () => { + const { baseElement } = render( + + Content 1 + Content 2 + , + ); + const el = baseElement.querySelector("goa-tabs"); + expect(el).toBeTruthy(); + expect(el?.getAttribute("variant")).toBeNull(); + }); }); diff --git a/libs/react-components/src/lib/tabs/tabs.tsx b/libs/react-components/src/lib/tabs/tabs.tsx index 4f5ee85449..ad0f3e1401 100644 --- a/libs/react-components/src/lib/tabs/tabs.tsx +++ b/libs/react-components/src/lib/tabs/tabs.tsx @@ -1,11 +1,12 @@ import React, { useEffect, useRef, type JSX } from "react"; -import { GoabTabsOnChangeDetail } from "@abgov/ui-components-common"; +import { GoabTabsOnChangeDetail, GoabTabsVariant } from "@abgov/ui-components-common"; interface WCProps { initialtab?: number; ref: React.RefObject; onChange?: (tab: number) => void; testid?: string; + variant?: GoabTabsVariant; } declare module "react" { @@ -21,6 +22,7 @@ export interface GoabTabsProps { initialTab?: number; children?: React.ReactNode; testId?: string; + variant?: GoabTabsVariant; onChange?: (detail: GoabTabsOnChangeDetail) => void; } @@ -28,6 +30,7 @@ export function GoabTabs({ initialTab, children, testId, + variant, onChange, }: GoabTabsProps): JSX.Element { const ref = useRef(null); @@ -47,7 +50,7 @@ export function GoabTabs({ }, [onChange]); return ( - + {children} ); diff --git a/libs/react-components/src/lib/temporary-notification-ctrl/temporary-notification-ctrl.tsx b/libs/react-components/src/lib/temporary-notification-ctrl/temporary-notification-ctrl.tsx index 0fbbe1a3f9..566a2a3015 100644 --- a/libs/react-components/src/lib/temporary-notification-ctrl/temporary-notification-ctrl.tsx +++ b/libs/react-components/src/lib/temporary-notification-ctrl/temporary-notification-ctrl.tsx @@ -1,12 +1,12 @@ import React, { useRef } from "react"; +import { transformProps, kebab } from "../common/extract-props"; type SnackbarVerticalPosition = "top" | "bottom"; type SnackbarHorizontalPosition = "left" | "center" | "right"; interface WCProps { - ref: React.RefObject; - verticalPosition?: SnackbarVerticalPosition; - horizontalPosition?: SnackbarHorizontalPosition; + "vertical-position"?: SnackbarVerticalPosition; + "horizontal-position"?: SnackbarHorizontalPosition; testid?: string; } @@ -14,7 +14,10 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-temp-notification-ctrl": WCProps & React.HTMLAttributes; + "goa-temp-notification-ctrl": WCProps & + React.HTMLAttributes & { + ref: React.RefObject; + }; } } } @@ -29,14 +32,19 @@ export const GoabTemporaryNotificationCtrl = ({ verticalPosition = "bottom", horizontalPosition = "center", testId, + ...rest }: GoabTemporaryNotificationCtrlProps) => { const el = useRef(null); + const _props = transformProps( + { "vertical-position": verticalPosition, "horizontal-position": horizontalPosition, ...rest }, + kebab + ); + return ( ); diff --git a/libs/react-components/src/lib/text/text.spec.tsx b/libs/react-components/src/lib/text/text.spec.tsx index 9e1fd7b247..576e3da4ac 100644 --- a/libs/react-components/src/lib/text/text.spec.tsx +++ b/libs/react-components/src/lib/text/text.spec.tsx @@ -72,4 +72,21 @@ describe('GoabText', () => { expect(element?.getAttribute('as')).toBe(tag); }); }); + + it('should apply id to the web component host', () => { + const { container } = render(Content); + const element = container.querySelector('goa-text'); + + expect(element?.getAttribute('id')).toBe('react-text-id'); + }); + + it("should pass data-grid attributes", () => { + const { container } = render( + + Test content + + ); + const el = container.querySelector("goa-text"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/text/text.tsx b/libs/react-components/src/lib/text/text.tsx index e01f5409a0..fe5824980b 100644 --- a/libs/react-components/src/lib/text/text.tsx +++ b/libs/react-components/src/lib/text/text.tsx @@ -5,14 +5,16 @@ import { GoabTextTextElement, GoabTextSize, GoabTextColor, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { as?: GoabTextTextElement | GoabTextHeadingElement; size?: GoabTextSize; maxwidth?: GoabTextMaxWidth; color?: GoabTextColor; + id?: string; } declare module "react" { @@ -24,29 +26,31 @@ declare module "react" { } } -interface GoATextProps extends Margins { +interface GoATextProps extends Margins, DataAttributes { /** @deprecated Please use 'tag' property instead */ as?: GoabTextTextElement | GoabTextHeadingElement; tag?: GoabTextTextElement | GoabTextHeadingElement; size?: GoabTextSize; maxWidth?: GoabTextMaxWidth; color?: GoabTextColor; + id?: string; children: ReactNode; } -export function GoabText(props: GoATextProps): JSX.Element { +export function GoabText({ + as, + tag, + children, + ...rest +}: GoATextProps): JSX.Element { + const _props = transformProps(rest, lowercase); + return ( - {props.children} + {children} ); } diff --git a/libs/react-components/src/lib/textarea/textarea.spec.tsx b/libs/react-components/src/lib/textarea/textarea.spec.tsx index 5e5a989bad..d775af6002 100644 --- a/libs/react-components/src/lib/textarea/textarea.spec.tsx +++ b/libs/react-components/src/lib/textarea/textarea.spec.tsx @@ -92,4 +92,16 @@ describe("TextArea", () => { expect(onChange).toBeCalled(); }); + + it("should pass data-grid attributes", () => { + render( + + ); + const el = document.querySelector("goa-textarea"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); }); diff --git a/libs/react-components/src/lib/textarea/textarea.tsx b/libs/react-components/src/lib/textarea/textarea.tsx index 16ff676ff5..b1f9f83c9b 100644 --- a/libs/react-components/src/lib/textarea/textarea.tsx +++ b/libs/react-components/src/lib/textarea/textarea.tsx @@ -3,12 +3,12 @@ import { GoabTextAreaOnChangeDetail, GoabTextAreaOnKeyPressDetail, GoabTextAreaOnBlurDetail, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import { useEffect, useRef, type JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; interface WCProps extends Margins { - ref: React.Ref; name: string; value?: string; placeholder?: string; @@ -29,12 +29,14 @@ declare module "react" { // eslint-disable-next-line @typescript-eslint/no-namespace namespace JSX { interface IntrinsicElements { - "goa-textarea": WCProps & React.HTMLAttributes; + "goa-textarea": WCProps & React.HTMLAttributes & { + ref: React.Ref; + }; } } } -export interface GoabTextAreaProps extends Margins { +export interface GoabTextAreaProps extends Margins, DataAttributes { name: string; value?: string; id?: string; @@ -57,30 +59,18 @@ export interface GoabTextAreaProps extends Margins { } export function GoabTextArea({ - name, - value, - placeholder, - rows, readOnly, disabled, - countBy, - maxCount, - width, - maxWidth, - testId, error, - ariaLabel, - mt, - mr, - mb, - ml, - autoComplete, onChange, onKeyPress, onBlur, + ...rest }: GoabTextAreaProps): JSX.Element { const el = useRef(null); + const _props = transformProps(rest, lowercase); + useEffect(() => { if (!el.current) { return; @@ -89,17 +79,17 @@ export function GoabTextArea({ const changeListener: EventListener = (e: Event) => { const detail = (e as CustomEvent).detail; - onChange?.(detail); + onChange?.({ ...detail, event: e }); }; const keypressListener = (e: unknown) => { const detail = (e as CustomEvent).detail; - onKeyPress?.(detail); + onKeyPress?.({ ...detail, event: e as Event }); }; const blurListener = (e: unknown) => { const detail = (e as CustomEvent).detail; - onBlur?.(detail); + onBlur?.({ ...detail, event: e as Event }); }; current.addEventListener("_change", changeListener); @@ -116,24 +106,10 @@ export function GoabTextArea({ return ( ); } diff --git a/libs/react-components/src/lib/tooltip/tooltip.spec.tsx b/libs/react-components/src/lib/tooltip/tooltip.spec.tsx index a5fdd9dc35..abf7d4f00b 100644 --- a/libs/react-components/src/lib/tooltip/tooltip.spec.tsx +++ b/libs/react-components/src/lib/tooltip/tooltip.spec.tsx @@ -38,4 +38,17 @@ describe("Tooltip", () => { expect(el?.getAttribute("maxwidth")).toBe("300px"); }); -}); \ No newline at end of file + + it("should pass data-grid attributes", () => { + const { baseElement } = render( + + Hover me + + ); + const el = baseElement.querySelector("goa-tooltip"); + expect(el?.getAttribute("data-grid")).toBe("cell"); + }); +}); diff --git a/libs/react-components/src/lib/tooltip/tooltip.tsx b/libs/react-components/src/lib/tooltip/tooltip.tsx index b2197c3f0d..e7d971fb27 100644 --- a/libs/react-components/src/lib/tooltip/tooltip.tsx +++ b/libs/react-components/src/lib/tooltip/tooltip.tsx @@ -1,9 +1,10 @@ import { GoabTooltipHorizontalAlignment, GoabTooltipPosition, - Margins, + Margins, DataAttributes, } from "@abgov/ui-components-common"; import { ReactNode, type JSX } from "react"; +import { transformProps, lowercase } from "../common/extract-props"; /* eslint-disable-next-line */ interface WCProps extends Margins { @@ -24,7 +25,7 @@ declare module "react" { } /* eslint-disable-next-line */ -export interface GoabTooltipProps extends Margins { +export interface GoabTooltipProps extends Margins, DataAttributes { position?: GoabTooltipPosition; content?: string | ReactNode; hAlign?: GoabTooltipHorizontalAlignment; @@ -33,23 +34,22 @@ export interface GoabTooltipProps extends Margins { children?: ReactNode; } -export function GoabTooltip(props: GoabTooltipProps): JSX.Element { - const isStringContent = typeof props.content === "string"; +export function GoabTooltip({ + content, + children, + ...rest +}: GoabTooltipProps): JSX.Element { + const _props = transformProps(rest, lowercase); + + const isStringContent = typeof content === "string"; return ( - {!isStringContent && props.content &&

{props.content}
} - {props.children} + {!isStringContent && content &&
{content}
} + {children} ); } diff --git a/libs/web-components/.eslintrc.json b/libs/web-components/.eslintrc.json index ca41bae324..1fec91a988 100644 --- a/libs/web-components/.eslintrc.json +++ b/libs/web-components/.eslintrc.json @@ -26,7 +26,7 @@ "error", { "ignoredFiles": ["{projectRoot}/vite.config.{js,ts,mjs,mts}"], - "ignoredDependencies": ["glob", "svelte", "@sveltejs/vite-plugin-svelte"] + "ignoredDependencies": ["glob", "date-fns", "svelte", "@sveltejs/vite-plugin-svelte"] } ] } diff --git a/libs/web-components/project.json b/libs/web-components/project.json index 59eba18fd3..8729a7fb1e 100644 --- a/libs/web-components/project.json +++ b/libs/web-components/project.json @@ -3,12 +3,11 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "libs/web-components/src", "projectType": "library", + "tags": [], "targets": { "build": { "executor": "@nx/vite:build", - "outputs": [ - "{options.outputPath}" - ], + "outputs": ["{options.outputPath}"], "defaultConfiguration": "production", "options": { "outputPath": "dist/libs/web-components" @@ -40,19 +39,15 @@ } }, "test": { - "executor": "@nx/vite:test", - "outputs": [ - "{options.reportsDirectory}" - ], + "executor": "@nx/vitest:test", + "outputs": ["{options.reportsDirectory}"], "options": { "reportsDirectory": "../../coverage/libs/web-components" } }, "lint": { "executor": "@nx/eslint:lint", - "outputs": [ - "{options.outputFile}" - ] + "outputs": ["{options.outputFile}"] }, "release": { "executor": "nx:run-commands", @@ -60,6 +55,5 @@ "command": "npx semantic-release -e ./libs/web-components/.releaserc.json" } } - }, - "tags": [] -} \ No newline at end of file + } +} diff --git a/libs/web-components/src/assets/css/components.css b/libs/web-components/src/assets/css/components.css index 7494b72b08..440e4b7c4c 100644 --- a/libs/web-components/src/assets/css/components.css +++ b/libs/web-components/src/assets/css/components.css @@ -46,27 +46,39 @@ goa-table.sticky thead { goa-table td { font: var(--goa-typography-body-m); - padding: var(--goa-space-xs) var(--goa-space-m) var(--goa-space-xs); - border-bottom: var(--goa-border-width-s) solid var(--goa-color-greyscale-200); + padding: var(--goa-table-padding-data, var(--goa-space-xs) var(--goa-space-m) var(--goa-space-xs)); + background-color: var(--goa-table-color-bg-data, var(--goa-color-greyscale-white)); + border-bottom: var(--goa-table-data-border, 1px solid var(--goa-color-greyscale-200)); vertical-align: top; box-sizing: border-box; - height: var(--goa-space-2xl); + min-height: var(--goa-table-height-data, var(--goa-space-2xl)); } +/* V2: Remove bottom border from last row to prevent doubling with table border */ +goa-table[version="2"] tbody tr:last-child td { + border-bottom: none; +} + +/* V2: Zebra striping for readability */ +goa-table[version="2"][striped="true"] tbody tr:nth-child(even) td { + background-color: var(--goa-color-greyscale-50); +} + +/* Relaxed variant - larger spacing and height for data cells only */ goa-table[variant="relaxed"] td { - padding: var(--goa-space-m); + padding: var(--goa-table-padding-data-relaxed, var(--goa-space-m)); + min-height: var(--goa-table-height-data-relaxed, 64px); } goa-table thead th { - background-color: var(--goa-color-greyscale-white); - color: var(--goa-table-color-heading); - padding: - var(--goa-space-s) - var(--goa-table-header-padding, var(--goa-space-m)) - var(--goa-space-xs) var(--goa-table-header-padding, var(--goa-space-m)); + background-color: var(--goa-table-color-bg-heading, var(--goa-color-greyscale-white)); + color: var(--goa-table-color-heading, var(--goa-color-greyscale-600)); + font: var(--goa-table-typography-heading, var(--goa-typography-heading-s)); + padding: var(--goa-table-padding-heading, var(--goa-space-s) var(--goa-space-m) var(--goa-space-xs)); text-align: left; - border-bottom: var(--goa-border-width-m) solid var(--goa-table-color-border-heading); + border-bottom: var(--goa-table-heading-border, 2px solid var(--goa-color-greyscale-600)); vertical-align: bottom; + min-height: var(--goa-table-height-heading, 56px); } .goa-table-number-column { @@ -78,24 +90,147 @@ goa-table thead th { text-align: right; } -.goa-table-number-header:not(:has(goa-table-sort-header)) { - padding-bottom: var(--goa-space-xs); -} - goa-table thead th:has(goa-table-sort-header) { - padding-bottom: 1px; - padding-top: 0; + padding: 0; } goa-table thead th:has(goa-table-sort-header):hover { - background-color: var(--goa-color-greyscale-100); - color: var(--goa-color-interactive-hover); + background-color: var(--goa-table-color-bg-heading-hover, var(--goa-color-greyscale-100)); + color: var(--goa-table-color-heading-hover, var(--goa-color-interactive-hover)); } goa-table tfoot td { background-color: var(--goa-color-greyscale-100); } +/* V2: Outer edge padding - larger padding on first and last columns */ + +/* Headers without TableSortHeader - apply padding to th */ +goa-table[version="2"] thead th:first-child:not(:has(goa-table-sort-header)) { + padding-left: var(--goa-space-l, 24px); +} + +goa-table[version="2"] thead th:last-child:not(:has(goa-table-sort-header)) { + padding-right: var(--goa-space-l, 24px); +} + +/* Headers with TableSortHeader - override token padding for button inside (all variants) */ +goa-table[version="2"] thead th:first-child:has(goa-table-sort-header):not(:last-child) { + --goa-table-padding-heading: 18px var(--goa-space-m) var(--goa-space-m) var(--goa-space-l); +} + +goa-table[version="2"] thead th:last-child:has(goa-table-sort-header):not(:first-child) { + --goa-table-padding-heading: 18px var(--goa-space-l) var(--goa-space-m) var(--goa-space-m); +} + +goa-table[version="2"] thead th:first-child:last-child:has(goa-table-sort-header) { + --goa-table-padding-heading: 18px var(--goa-space-l) var(--goa-space-m) var(--goa-space-l); +} + +/* Data and footer cells */ +goa-table[version="2"] tbody td:first-child, +goa-table[version="2"] tfoot td:first-child { + padding-left: var(--goa-space-l, 24px); +} + +goa-table[version="2"] tbody td:last-child, +goa-table[version="2"] tfoot td:last-child { + padding-right: var(--goa-space-l, 24px); +} + + +/* Normal Variant Cell Types */ + +goa-table td.goa-table-cell--text { + padding-top: var(--goa-table-padding-cell-text, var(--goa-space-s)) !important; + padding-bottom: var(--goa-table-padding-cell-text, var(--goa-space-s)) !important; +} + +goa-table td.goa-table-cell--checkbox { + padding-top: var(--goa-table-padding-cell-checkbox, 2px) !important; + padding-bottom: var(--goa-table-padding-cell-checkbox, 2px) !important; + text-align: center; +} + +goa-table td.goa-table-cell--form-field { + padding-top: var(--goa-table-padding-cell-form-field, 3px) !important; + padding-bottom: var(--goa-table-padding-cell-form-field, 3px) !important; +} + +goa-table td.goa-table-cell--badge { + padding-top: var(--goa-table-padding-cell-badge, var(--goa-space-s)) !important; + padding-bottom: var(--goa-table-padding-cell-badge, var(--goa-space-s)) !important; +} + +/* Alignment helper classes */ + +goa-table td.goa-table-cell--numeric, +goa-table th.goa-table-cell--numeric { + text-align: right; + font-variant-numeric: tabular-nums; +} + +goa-table th.goa-table-cell--numeric goa-table-sort-header { + text-align: right; + justify-content: flex-end; +} + +goa-table td.goa-table-cell--numeric { + padding-top: var(--goa-table-padding-cell-text, var(--goa-space-s)) !important; + padding-bottom: var(--goa-table-padding-cell-text, var(--goa-space-s)) !important; +} + +goa-table td.goa-table-cell--actions { + padding-top: var(--goa-table-padding-cell-actions, 7px) !important; + padding-bottom: var(--goa-table-padding-cell-actions, 7px) !important; + text-align: right; + white-space: nowrap; +} + +goa-table td.goa-table-cell--text-supporting { + padding-top: var(--goa-table-padding-cell-text, var(--goa-space-s)) !important; + padding-bottom: var(--goa-table-padding-cell-text, var(--goa-space-s)) !important; +} + +/* Relaxed variant overrides for alignment/layout classes */ + +goa-table[variant="relaxed"] td.goa-table-cell--numeric { + padding-top: var(--goa-table-padding-cell-text-relaxed, 20px) !important; + padding-bottom: var(--goa-table-padding-cell-text-relaxed, 20px) !important; +} + +goa-table[variant="relaxed"] td.goa-table-cell--actions { + padding-top: var(--goa-table-padding-cell-actions-relaxed, 14px) !important; + padding-bottom: var(--goa-table-padding-cell-actions-relaxed, 14px) !important; +} + +goa-table[variant="relaxed"] td.goa-table-cell--text-supporting { + padding-top: var(--goa-table-padding-cell-text-supporting-relaxed, 8px) !important; + padding-bottom: var(--goa-table-padding-cell-text-supporting-relaxed, 8px) !important; +} + +/* Relaxed Variant Cell Types */ + +goa-table[variant="relaxed"] td.goa-table-cell--text { + padding-top: var(--goa-table-padding-cell-text-relaxed, 20px) !important; + padding-bottom: var(--goa-table-padding-cell-text-relaxed, 20px) !important; +} + +goa-table[variant="relaxed"] td.goa-table-cell--checkbox { + padding-top: var(--goa-table-padding-cell-checkbox-relaxed, 10px) !important; + padding-bottom: var(--goa-table-padding-cell-checkbox-relaxed, 10px) !important; +} + +goa-table[variant="relaxed"] td.goa-table-cell--form-field { + padding-top: var(--goa-table-padding-cell-form-field-relaxed, 11px) !important; + padding-bottom: var(--goa-table-padding-cell-form-field-relaxed, 11px) !important; +} + +goa-table[variant="relaxed"] td.goa-table-cell--badge { + padding-top: var(--goa-table-padding-cell-badge-relaxed, 20px) !important; + padding-bottom: var(--goa-table-padding-cell-badge-relaxed, 20px) !important; +} + goa-table tfoot tr:first-child td { border-top: var(--goa-border-width-m) solid var(--goa-color-greyscale-200); } diff --git a/libs/web-components/src/assets/css/reset.css b/libs/web-components/src/assets/css/reset.css index 52c4a1f363..a242ab8320 100644 --- a/libs/web-components/src/assets/css/reset.css +++ b/libs/web-components/src/assets/css/reset.css @@ -67,6 +67,11 @@ a:hover { color: var(--goa-color-interactive-hover); } +a:focus-visible, a:focus-within, a:focus { + outline: 3px solid var(--goa-color-interactive-focus); + outline-offset: 1px; +} + ::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */ color: #999; diff --git a/libs/web-components/src/common/calendar-date.spec.ts b/libs/web-components/src/common/calendar-date.spec.ts new file mode 100644 index 0000000000..5e50dbe477 --- /dev/null +++ b/libs/web-components/src/common/calendar-date.spec.ts @@ -0,0 +1,460 @@ +import { describe, it, expect } from "vitest"; +import { CalendarDate } from "./calendar-date"; + +describe("CalendarDate", () => { + describe("parse", () => { + it("parses a string date in YYYY-MM-DD format", () => { + const result = CalendarDate.parse("2024-03-15"); + expect(result).toEqual([2024, 3, 15]); + }); + + it("parses a string date with ISO timestamp", () => { + const result = CalendarDate.parse("2024-03-15T10:30:00Z"); + expect(result).toEqual([2024, 3, 15]); + }); + + it("parses a Date object", () => { + const date = new Date(2024, 2, 15); // Month is 0-indexed + const result = CalendarDate.parse(date); + expect(result).toEqual([2024, 3, 15]); // Month is 1-indexed in result + }); + + it("parses an object with year, month, day", () => { + const result = CalendarDate.parse({ year: 2024, month: 3, day: 15 }); + expect(result).toEqual([2024, 3, 15]); + }); + }); + + describe("constructor", () => { + it("creates a CalendarDate from a string", () => { + const calDate = new CalendarDate("2024-03-15"); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(15); + }); + + it("creates a CalendarDate from a Date object", () => { + const date = new Date(2024, 2, 15); + const calDate = new CalendarDate(date); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(15); + }); + + it("creates a CalendarDate from an object", () => { + const calDate = new CalendarDate({ year: 2024, month: 3, day: 15 }); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(15); + }); + + it("creates a CalendarDate with current date when no value provided", () => { + const calDate = new CalendarDate(); + const now = new Date(); + expect(calDate.year).toBe(now.getFullYear()); + expect(calDate.month).toBe(now.getMonth() + 1); + expect(calDate.day).toBe(now.getDate()); + }); + }); + + describe("getters", () => { + const calDate = new CalendarDate("2024-03-15"); + + it("returns the year", () => { + expect(calDate.year).toBe(2024); + }); + + it("returns the month", () => { + expect(calDate.month).toBe(3); + }); + + it("returns the day", () => { + expect(calDate.day).toBe(15); + }); + + it("returns the date as a Date object", () => { + const date = calDate.date; + expect(date).toBeInstanceOf(Date); + expect(date.getFullYear()).toBe(2024); + expect(date.getMonth()).toBe(2); // 0-indexed + expect(date.getDate()).toBe(15); + }); + + it("returns the day of week", () => { + // March 15, 2024 is a Friday (5) + expect(calDate.dayOfWeek).toBe(5); + }); + + it("returns the number of days in the month", () => { + // March has 31 days + expect(calDate.daysInMonth).toBe(31); + }); + + it("returns the first day of the month", () => { + const firstDay = calDate.firstDayOfMonth; + expect(firstDay.year).toBe(2024); + expect(firstDay.month).toBe(3); + expect(firstDay.day).toBe(1); + }); + + it("returns the last day of the month", () => { + const lastDay = calDate.lastDayOfMonth; + expect(lastDay.year).toBe(2024); + expect(lastDay.month).toBe(3); + expect(lastDay.day).toBe(31); + }); + + it("returns the previous day", () => { + const prevDay = calDate.previousDay; + expect(prevDay.year).toBe(2024); + expect(prevDay.month).toBe(3); + expect(prevDay.day).toBe(14); + }); + + it("returns the next day", () => { + const nextDay = calDate.nextDay; + expect(nextDay.year).toBe(2024); + expect(nextDay.month).toBe(3); + expect(nextDay.day).toBe(16); + }); + + it("returns the previous month", () => { + const prevMonth = calDate.previousMonth; + expect(prevMonth.year).toBe(2024); + expect(prevMonth.month).toBe(2); + expect(prevMonth.day).toBe(15); + }); + + it("returns the next month", () => { + const nextMonth = calDate.nextMonth; + expect(nextMonth.year).toBe(2024); + expect(nextMonth.month).toBe(4); + expect(nextMonth.day).toBe(15); + }); + }); + + describe("setters", () => { + it("sets the year", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.setYear(2025); + expect(calDate.year).toBe(2025); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(15); + }); + + it("sets the month", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.setMonth(6); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(6); + expect(calDate.day).toBe(15); + }); + + it("sets the day and returns the instance", () => { + const calDate = new CalendarDate("2024-03-15"); + const result = calDate.setDay(20); + expect(result).toBe(calDate); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(20); + }); + }); + + describe("addYears", () => { + it("adds positive years", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.addYears(2); + expect(calDate.year).toBe(2026); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(15); + }); + + it("adds negative years", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.addYears(-2); + expect(calDate.year).toBe(2022); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(15); + }); + + it("returns the instance for chaining", () => { + const calDate = new CalendarDate("2024-03-15"); + const result = calDate.addYears(1); + expect(result).toBe(calDate); + }); + }); + + describe("addMonths", () => { + it("adds positive months within the same year", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.addMonths(2); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(5); + expect(calDate.day).toBe(15); + }); + + it("adds positive months across years", () => { + const calDate = new CalendarDate("2024-11-15"); + calDate.addMonths(3); + expect(calDate.year).toBe(2025); + expect(calDate.month).toBe(2); + expect(calDate.day).toBe(15); + }); + + it("adds negative months", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.addMonths(-2); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(1); + expect(calDate.day).toBe(15); + }); + + it("handles month overflow correctly", () => { + const calDate = new CalendarDate("2024-01-31"); + calDate.addMonths(1); + // January 31 + 1 month = February 29, 2024 (leap year) + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(2); + expect(calDate.day).toBe(29); + }); + + it("returns the instance for chaining", () => { + const calDate = new CalendarDate("2024-03-15"); + const result = calDate.addMonths(1); + expect(result).toBe(calDate); + }); + }); + + describe("addDays", () => { + it("adds positive days within the same month", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.addDays(5); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(20); + }); + + it("adds positive days across months", () => { + const calDate = new CalendarDate("2024-03-29"); + calDate.addDays(5); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(4); + expect(calDate.day).toBe(3); + }); + + it("adds positive days across years", () => { + const calDate = new CalendarDate("2024-12-30"); + calDate.addDays(5); + expect(calDate.year).toBe(2025); + expect(calDate.month).toBe(1); + expect(calDate.day).toBe(4); + }); + + it("adds negative days", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.addDays(-5); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(3); + expect(calDate.day).toBe(10); + }); + + it("adds negative days across months", () => { + const calDate = new CalendarDate("2024-03-02"); + calDate.addDays(-5); + expect(calDate.year).toBe(2024); + expect(calDate.month).toBe(2); + expect(calDate.day).toBe(26); + }); + + it("returns the instance for chaining", () => { + const calDate = new CalendarDate("2024-03-15"); + const result = calDate.addDays(1); + expect(result).toBe(calDate); + }); + }); + + describe("comparison methods", () => { + describe("isSameDay", () => { + it("returns true for the same day", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-03-15"); + expect(date1.isSameDay(date2)).toBe(true); + }); + + it("returns false for different days", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-03-16"); + expect(date1.isSameDay(date2)).toBe(false); + }); + + it("returns false for same day in different months", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-04-15"); + expect(date1.isSameDay(date2)).toBe(false); + }); + }); + + describe("isSameMonth", () => { + it("returns true for the same month", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-03-20"); + expect(date1.isSameMonth(date2)).toBe(true); + }); + + it("returns false for different months", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-04-15"); + expect(date1.isSameMonth(date2)).toBe(false); + }); + + it("returns false for same month in different years", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2025-03-15"); + expect(date1.isSameMonth(date2)).toBe(false); + }); + }); + + describe("isBefore", () => { + it("returns true when date is before comparison date", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-03-20"); + expect(date1.isBefore(date2)).toBe(true); + }); + + it("returns false when date is after comparison date", () => { + const date1 = new CalendarDate("2024-03-20"); + const date2 = new CalendarDate("2024-03-15"); + expect(date1.isBefore(date2)).toBe(false); + }); + + it("returns false when dates are the same", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-03-15"); + expect(date1.isBefore(date2)).toBe(false); + }); + }); + + describe("isAfter", () => { + it("returns true when date is after comparison date", () => { + const date1 = new CalendarDate("2024-03-20"); + const date2 = new CalendarDate("2024-03-15"); + expect(date1.isAfter(date2)).toBe(true); + }); + + it("returns false when date is before comparison date", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-03-20"); + expect(date1.isAfter(date2)).toBe(false); + }); + + it("returns false when dates are the same", () => { + const date1 = new CalendarDate("2024-03-15"); + const date2 = new CalendarDate("2024-03-15"); + expect(date1.isAfter(date2)).toBe(false); + }); + }); + }); + + describe("clone", () => { + it("creates a new instance with the same date", () => { + const original = new CalendarDate("2024-03-15"); + const cloned = original.clone(); + + expect(cloned).not.toBe(original); + expect(cloned.year).toBe(original.year); + expect(cloned.month).toBe(original.month); + expect(cloned.day).toBe(original.day); + }); + + it("creates an independent instance", () => { + const original = new CalendarDate("2024-03-15"); + const cloned = original.clone(); + + cloned.addDays(5); + + expect(original.day).toBe(15); + expect(cloned.day).toBe(20); + }); + }); + + describe("isValid", () => { + it("returns true for a valid date", () => { + const calDate = new CalendarDate("2024-03-15"); + expect(calDate.isValid()).toBe(true); + }); + + it("returns true for edge case dates", () => { + const leapDay = new CalendarDate("2024-02-29"); + expect(leapDay.isValid()).toBe(true); + }); + }); + + describe("format", () => { + it("formats the date using date-fns format string", () => { + const calDate = new CalendarDate("2024-03-15"); + expect(calDate.format("yyyy-MM-dd")).toBe("2024-03-15"); + }); + + it("formats with different patterns", () => { + const calDate = new CalendarDate("2024-03-15"); + expect(calDate.format("MMM d, yyyy")).toBe("Mar 15, 2024"); + }); + + it("formats with full month name", () => { + const calDate = new CalendarDate("2024-03-15"); + expect(calDate.format("MMMM d, yyyy")).toBe("March 15, 2024"); + }); + }); + + describe("toString", () => { + it("returns the date as hyphen-separated values", () => { + const calDate = new CalendarDate({ year: 2024, month: 3, day: 15 }); + const result = calDate.toString(); + expect(result).toBe("2024-03-15"); + }); + + it("can be used to create a new CalendarDate", () => { + const original = new CalendarDate({ year: 2024, month: 3, day: 15 }); + const str = original.toString(); + const cloned = new CalendarDate(str); + expect(cloned.year).toBe(original.year); + expect(cloned.month).toBe(original.month); + expect(cloned.day).toBe(original.day); + }); + }); + + describe("edge cases", () => { + it("handles leap year correctly", () => { + const leapDay = new CalendarDate("2024-02-29"); + expect(leapDay.daysInMonth).toBe(29); + expect(leapDay.isValid()).toBe(true); + }); + + it("handles non-leap year correctly", () => { + const feb2023 = new CalendarDate("2023-02-15"); + expect(feb2023.daysInMonth).toBe(28); + }); + + it("handles month boundaries when adding days", () => { + const endOfMonth = new CalendarDate("2024-01-31"); + endOfMonth.addDays(1); + expect(endOfMonth.month).toBe(2); + expect(endOfMonth.day).toBe(1); + }); + + it("handles year boundaries when adding months", () => { + const endOfYear = new CalendarDate("2024-12-15"); + endOfYear.addMonths(1); + expect(endOfYear.year).toBe(2025); + expect(endOfYear.month).toBe(1); + }); + + it("handles chaining multiple operations", () => { + const calDate = new CalendarDate("2024-03-15"); + calDate.addYears(1).addMonths(2).addDays(5); + expect(calDate.year).toBe(2025); + expect(calDate.month).toBe(5); + expect(calDate.day).toBe(20); + }); + }); +}); diff --git a/libs/web-components/src/common/calendar-date.ts b/libs/web-components/src/common/calendar-date.ts new file mode 100644 index 0000000000..55fa06b03a --- /dev/null +++ b/libs/web-components/src/common/calendar-date.ts @@ -0,0 +1,195 @@ +import { + addMonths as _addMonths, + addDays as _addDays, + format as _format, + getDaysInMonth as _getDaysInMonth, + isSameDay as _isSameDay, + lastDayOfMonth as _lastDayOfMonth, + setDate as _setDate, + isSameMonth as _isSameMonth, + isBefore as _isBefore, + addYears as _addYears, + isAfter as _isAfter, +} from "date-fns"; + +type CalendarDateInput = + | string + | Date + | 0 + | { year: number; month: number; day: number }; + +export class CalendarDate { + private _dateNums: number[]; + + static parse(value: CalendarDateInput): number[] { + if (typeof value === "string") { + value = value.split("T")[0]; + return value.split("-").map((v) => +v); + } else if (value instanceof Date) { + return [value.getFullYear(), value.getMonth() + 1, value.getDate()]; + } else if (value === 0) { + return [0, 0, 0]; + } else { + return [value.year, value.month, value.day]; + } + } + + static init(): CalendarDate { + return new CalendarDate(0); + } + + constructor(value?: CalendarDateInput) { + if (value || value === 0) { + this._dateNums = CalendarDate.parse(value); + } else { + this._dateNums = CalendarDate.parse(new Date()); + } + } + + // Used internally to get the date value for the date_fns + get date(): Date { + return new Date( + this._dateNums[0], + this._dateNums[1] - 1, + this._dateNums[2], + ); + } + + get year(): number { + return this._dateNums[0]; + } + + get month(): number { + return this._dateNums[1]; + } + + get day(): number { + return this._dateNums[2]; + } + + get dayOfWeek(): number { + return this.date.getDay(); + } + + get daysInMonth(): number { + return _getDaysInMonth(this.date); + } + + get firstDayOfMonth(): CalendarDate { + return new CalendarDate({ year: this.year, month: this.month, day: 1 }); + } + + get lastDayOfMonth(): CalendarDate { + return new CalendarDate(_lastDayOfMonth(this.date)); + } + + get previousDay(): CalendarDate { + return this.clone().addDays(-1); + } + + get nextDay(): CalendarDate { + return this.clone().addDays(1); + } + + get previousWeek(): CalendarDate { + return this.clone().addDays(-7); + } + + get nextWeek(): CalendarDate { + return this.clone().addDays(7); + } + + get previousMonth(): CalendarDate { + return this.clone().addMonths(-1); + } + + get nextMonth(): CalendarDate { + return this.clone().addMonths(1); + } + + clone(): CalendarDate { + return new CalendarDate(this.toString()); + } + + setYear(val: number) { + this._dateNums[0] = val; + } + + setMonth(val: number) { + this._dateNums[1] = val; + } + + setDay(val: number): CalendarDate { + this._dateNums[2] = val; + return this; + } + + addYears(count: number): CalendarDate { + this._dateNums[0] += count; + return this; + } + + addMonths(count: number): CalendarDate { + this._dateNums = CalendarDate.parse(_addMonths(this.date, count)); + return this; + } + + addDays(count: number): CalendarDate { + this._dateNums = CalendarDate.parse(_addDays(this.date, count)); + return this; + } + + isSameDay(cmp: CalendarDate): boolean { + return _isSameDay(this.date, cmp.date); + } + + isSameMonth(value: CalendarDate): boolean { + return _isSameMonth(this.date, value.date); + } + + isBefore(cmp: CalendarDate): boolean { + return _isBefore(this.date, cmp.date); + } + + isAfter(cmp: CalendarDate): boolean { + return _isAfter(this.date, cmp.date); + } + + isZero(): boolean { + return ( + this._dateNums[0] === 0 && + this._dateNums[1] === 0 && + this._dateNums[2] === 0 + ); + } + + isValid(): boolean { + // ensure it's a valid date + // E.g. "2025-02-31" would be invalid because the date does not exist + const comparisonDate = new Date(this.toString()); + if ( + isNaN(comparisonDate.getTime()) || + this.toString() !== comparisonDate.toISOString().split("T")[0] + ) { + return false; + } + + return true; + } + + format(tmpl: string): string { + if (this.isZero()) { + return ""; + } + return _format(this.date, tmpl); + } + + toString(): string { + if (this.isZero()) { + return ""; + } + return this._dateNums + .map((num) => (`${num}`.length < 2 ? `0${num}` : `${num}`)) + .join("-"); + } +} diff --git a/libs/web-components/src/common/types.ts b/libs/web-components/src/common/types.ts index 2189cecabf..517f851115 100644 --- a/libs/web-components/src/common/types.ts +++ b/libs/web-components/src/common/types.ts @@ -1,4 +1,4 @@ // Drawer export type DrawerPosition = "bottom" | "left" | "right" | undefined; -export type DrawerSizeUnit = "px" | "rem" | "ch" | "vh" | "vw"; +export type DrawerSizeUnit = "px" | "rem" | "ch" | "vh" | "vw" | "%"; export type DrawerSize = `${number}${DrawerSizeUnit}` | undefined; diff --git a/libs/web-components/src/common/utils.spec.ts b/libs/web-components/src/common/utils.spec.ts index bd93797c50..8f055a6118 100644 --- a/libs/web-components/src/common/utils.spec.ts +++ b/libs/web-components/src/common/utils.spec.ts @@ -1,5 +1,5 @@ import { waitFor } from "@testing-library/svelte"; -import { getTimestamp, performOnce, announceToScreenReader, typeValidator, getLocalDateValues } from "./utils"; +import { getTimestamp, performOnce, announceToScreenReader, typeValidator, getLocalDateValues, isFocusable, findFirstFocusableNode } from "./utils"; import { it, describe, expect, vi, beforeEach, afterEach } from "vitest"; describe("getTimestamp", () => { @@ -349,3 +349,533 @@ describe("getLocalDateValues", () => { expect(result).toBeNull(); }); }); + +describe("isFocusable", () => { + describe("non-element nodes", () => { + it("returns false for text nodes", () => { + const textNode = document.createTextNode("test"); + expect(isFocusable(textNode)).toBe(false); + }); + + it("returns false for comment nodes", () => { + const commentNode = document.createComment("test comment"); + expect(isFocusable(commentNode)).toBe(false); + }); + + it("returns false for document fragment", () => { + const fragment = document.createDocumentFragment(); + expect(isFocusable(fragment)).toBe(false); + }); + }); + + describe("tabindex handling", () => { + it("returns true for positive tabindex", () => { + const div = document.createElement("div"); + div.tabIndex = 1; + expect(isFocusable(div)).toBe(true); + }); + + it("returns true for tabindex=0 with explicit tabIndex attribute", () => { + const div = document.createElement("div"); + div.setAttribute("tabindex", "0"); + expect(isFocusable(div)).toBe(true); + }); + + it("returns false for negative tabindex", () => { + const div = document.createElement("div"); + div.tabIndex = -1; + expect(isFocusable(div)).toBe(false); + }); + + it("returns false for tabindex='-1' attribute", () => { + const div = document.createElement("div"); + div.setAttribute("tabindex", "-1"); + expect(isFocusable(div)).toBe(false); + }); + }); + + describe("disabled elements", () => { + it("returns false for disabled input via property", () => { + const input = document.createElement("input"); + input.disabled = true; + expect(isFocusable(input)).toBe(false); + }); + + it("returns false for disabled input via attribute", () => { + const input = document.createElement("input"); + input.setAttribute("disabled", ""); + expect(isFocusable(input)).toBe(false); + }); + + it("returns false for disabled button via property", () => { + const button = document.createElement("button"); + button.disabled = true; + expect(isFocusable(button)).toBe(false); + }); + + it("returns false for disabled button via attribute", () => { + const button = document.createElement("button"); + button.setAttribute("disabled", "disabled"); + expect(isFocusable(button)).toBe(false); + }); + + it("returns false for disabled select", () => { + const select = document.createElement("select"); + select.disabled = true; + expect(isFocusable(select)).toBe(false); + }); + + it("returns false for disabled textarea", () => { + const textarea = document.createElement("textarea"); + textarea.setAttribute("disabled", ""); + expect(isFocusable(textarea)).toBe(false); + }); + + it("returns false for elements with disabled attribute (generic elements)", () => { + const div = document.createElement("div"); + div.setAttribute("disabled", "true"); + expect(isFocusable(div)).toBe(false); + }); + }); + + describe("anchor elements", () => { + it("returns true for anchor with href", () => { + const anchor = document.createElement("a"); + anchor.href = "https://example.com"; + expect(isFocusable(anchor)).toBe(true); + }); + + it("returns false for anchor without href", () => { + const anchor = document.createElement("a"); + expect(isFocusable(anchor)).toBe(false); + }); + + it("returns true for anchor with empty href (resolves to current page)", () => { + const anchor = document.createElement("a"); + anchor.href = ""; + // Empty href gets resolved to current page URL, so it's actually focusable + expect(isFocusable(anchor)).toBe(true); + }); + + it("returns false for anchor with rel='ignore'", () => { + const anchor = document.createElement("a"); + anchor.href = "https://example.com"; + anchor.rel = "ignore"; + expect(isFocusable(anchor)).toBe(false); + }); + + it("returns true for anchor with href and other rel values", () => { + const anchor = document.createElement("a"); + anchor.href = "https://example.com"; + anchor.rel = "noopener"; + expect(isFocusable(anchor)).toBe(true); + }); + }); + + describe("input elements", () => { + it("returns true for text input", () => { + const input = document.createElement("input"); + input.type = "text"; + expect(isFocusable(input)).toBe(true); + }); + + it("returns true for email input", () => { + const input = document.createElement("input"); + input.type = "email"; + expect(isFocusable(input)).toBe(true); + }); + + it("returns true for number input", () => { + const input = document.createElement("input"); + input.type = "number"; + expect(isFocusable(input)).toBe(true); + }); + + it("returns true for checkbox input", () => { + const input = document.createElement("input"); + input.type = "checkbox"; + expect(isFocusable(input)).toBe(true); + }); + + it("returns true for radio input", () => { + const input = document.createElement("input"); + input.type = "radio"; + expect(isFocusable(input)).toBe(true); + }); + + it("returns false for hidden input", () => { + const input = document.createElement("input"); + input.type = "hidden"; + expect(isFocusable(input)).toBe(false); + }); + + it("returns false for file input", () => { + const input = document.createElement("input"); + input.type = "file"; + expect(isFocusable(input)).toBe(false); + }); + + it("returns false for disabled input", () => { + const input = document.createElement("input"); + input.type = "text"; + input.disabled = false; + input.setAttribute("disabled", ""); + expect(isFocusable(input)).toBe(false); + }); + }); + + describe("form elements", () => { + it("returns true for button element", () => { + const button = document.createElement("button"); + expect(isFocusable(button)).toBe(true); + }); + + it("returns true for select element", () => { + const select = document.createElement("select"); + expect(isFocusable(select)).toBe(true); + }); + + it("returns true for textarea element", () => { + const textarea = document.createElement("textarea"); + expect(isFocusable(textarea)).toBe(true); + }); + }); + + describe("non-focusable elements", () => { + it("returns false for div without tabindex", () => { + const div = document.createElement("div"); + expect(isFocusable(div)).toBe(false); + }); + + it("returns false for span without tabindex", () => { + const span = document.createElement("span"); + expect(isFocusable(span)).toBe(false); + }); + + it("returns false for p without tabindex", () => { + const p = document.createElement("p"); + expect(isFocusable(p)).toBe(false); + }); + + it("returns false for img without tabindex", () => { + const img = document.createElement("img"); + expect(isFocusable(img)).toBe(false); + }); + }); +}); + +describe("findFirstFocusableNode", () => { + let container: HTMLElement; + + beforeEach(() => { + container = document.createElement("div"); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + }); + + describe("basic functionality", () => { + it("returns null for empty NodeList", () => { + const emptyNodeList = document.querySelectorAll("nonexistent"); + expect(findFirstFocusableNode(emptyNodeList)).toBeNull(); + }); + + it("returns null for empty array", () => { + expect(findFirstFocusableNode([])).toBeNull(); + }); + + it("returns null when no focusable elements exist", () => { + const div = document.createElement("div"); + const span = document.createElement("span"); + div.appendChild(span); + + expect(findFirstFocusableNode([div])).toBeNull(); + }); + + it("finds first focusable element", () => { + const button = document.createElement("button"); + button.textContent = "Click me"; + + expect(findFirstFocusableNode([button])).toBe(button); + }); + }); + + describe("element types", () => { + it("finds focusable button", () => { + const button = document.createElement("button"); + expect(findFirstFocusableNode([button])).toBe(button); + }); + + it("finds focusable input", () => { + const input = document.createElement("input"); + input.type = "text"; + expect(findFirstFocusableNode([input])).toBe(input); + }); + + it("finds focusable select", () => { + const select = document.createElement("select"); + expect(findFirstFocusableNode([select])).toBe(select); + }); + + it("finds focusable textarea", () => { + const textarea = document.createElement("textarea"); + expect(findFirstFocusableNode([textarea])).toBe(textarea); + }); + + it("finds focusable anchor with href", () => { + const anchor = document.createElement("a"); + anchor.href = "https://example.com"; + expect(findFirstFocusableNode([anchor])).toBe(anchor); + }); + + it("finds element with positive tabindex", () => { + const div = document.createElement("div"); + div.tabIndex = 1; + expect(findFirstFocusableNode([div])).toBe(div); + }); + + it("finds element with tabindex=0", () => { + const div = document.createElement("div"); + div.setAttribute("tabindex", "0"); + expect(findFirstFocusableNode([div])).toBe(div); + }); + }); + + describe("skips non-focusable elements", () => { + it("skips disabled elements", () => { + const button1 = document.createElement("button"); + button1.disabled = true; + + const button2 = document.createElement("button"); + button2.textContent = "Focusable"; + + expect(findFirstFocusableNode([button1, button2])).toBe(button2); + }); + + it("skips hidden inputs", () => { + const hiddenInput = document.createElement("input"); + hiddenInput.type = "hidden"; + + const textInput = document.createElement("input"); + textInput.type = "text"; + + expect(findFirstFocusableNode([hiddenInput, textInput])).toBe(textInput); + }); + + it("skips file inputs", () => { + const fileInput = document.createElement("input"); + fileInput.type = "file"; + + const textInput = document.createElement("input"); + textInput.type = "text"; + + expect(findFirstFocusableNode([fileInput, textInput])).toBe(textInput); + }); + + it("skips anchors without href", () => { + const anchorNoHref = document.createElement("a"); + + const button = document.createElement("button"); + + expect(findFirstFocusableNode([anchorNoHref, button])).toBe(button); + }); + + it("skips elements with negative tabindex", () => { + const div = document.createElement("div"); + div.tabIndex = -1; + + const button = document.createElement("button"); + + expect(findFirstFocusableNode([div, button])).toBe(button); + }); + + it("skips elements with data-ignore-focus attribute", () => { + const button1 = document.createElement("button"); + button1.setAttribute("data-ignore-focus", "true"); + + const button2 = document.createElement("button"); + + expect(findFirstFocusableNode([button1, button2])).toBe(button2); + }); + }); + + describe("child node traversal", () => { + it("finds focusable element in child nodes", () => { + const container = document.createElement("div"); + const button = document.createElement("button"); + container.appendChild(button); + + expect(findFirstFocusableNode([container])).toBe(button); + }); + + it("finds first focusable element in deeply nested structure", () => { + const container = document.createElement("div"); + const section = document.createElement("section"); + const article = document.createElement("article"); + const button = document.createElement("button"); + + container.appendChild(section); + section.appendChild(article); + article.appendChild(button); + + expect(findFirstFocusableNode([container])).toBe(button); + }); + + it("finds first focusable element among multiple nested elements", () => { + const container = document.createElement("div"); + + // First nested structure + const div1 = document.createElement("div"); + const span1 = document.createElement("span"); // not focusable + div1.appendChild(span1); + + // Second nested structure + const div2 = document.createElement("div"); + const button = document.createElement("button"); // first focusable + const input = document.createElement("input"); // also focusable but comes after + div2.appendChild(button); + div2.appendChild(input); + + container.appendChild(div1); + container.appendChild(div2); + + expect(findFirstFocusableNode([container])).toBe(button); + }); + }); + + describe("shadow DOM support", () => { + it("finds focusable element in shadow DOM", () => { + // Skip if Shadow DOM is not supported + if (!HTMLElement.prototype.attachShadow) { + return; + } + + const host = document.createElement("div"); + const shadowRoot = host.attachShadow({ mode: "open" }); + const button = document.createElement("button"); + shadowRoot.appendChild(button); + + expect(findFirstFocusableNode([host])).toBe(button); + }); + }); + + describe("slot support", () => { + it("finds focusable element in slot assigned nodes", () => { + const slot = document.createElement("slot"); + const button = document.createElement("button"); + + // Mock assignedNodes for testing + vi.spyOn(slot, 'assignedNodes').mockReturnValue([button]); + + expect(findFirstFocusableNode([slot])).toBe(button); + }); + + it("handles empty slot", () => { + const slot = document.createElement("slot"); + + // Mock assignedNodes returning empty array + vi.spyOn(slot, 'assignedNodes').mockReturnValue([]); + + expect(findFirstFocusableNode([slot])).toBeNull(); + }); + }); + + describe("reversed parameter", () => { + it("searches in reverse order when reversed=true", () => { + const button1 = document.createElement("button"); + button1.id = "first"; + + const button2 = document.createElement("button"); + button2.id = "second"; + + const button3 = document.createElement("button"); + button3.id = "third"; + + // Normal order should find first button + expect(findFirstFocusableNode([button1, button2, button3], false)).toBe(button1); + + // Reversed order should find last button + expect(findFirstFocusableNode([button1, button2, button3], true)).toBe(button3); + }); + + it("finds last focusable element in nested structure when reversed", () => { + const container1 = document.createElement("div"); + const button1 = document.createElement("button"); + button1.id = "first"; + container1.appendChild(button1); + + const container2 = document.createElement("div"); + const button2 = document.createElement("button"); + button2.id = "second"; + container2.appendChild(button2); + + // Reversed should find the last focusable element + expect(findFirstFocusableNode([container1, container2], true)).toBe(button2); + }); + }); + + describe("complex scenarios", () => { + it("handles mixed focusable and non-focusable elements", () => { + const span = document.createElement("span"); // not focusable + const div = document.createElement("div"); // not focusable + const disabledButton = document.createElement("button"); + disabledButton.disabled = true; // not focusable + const enabledButton = document.createElement("button"); // focusable! + const hiddenInput = document.createElement("input"); + hiddenInput.type = "hidden"; // not focusable + + expect(findFirstFocusableNode([span, div, disabledButton, enabledButton, hiddenInput])).toBe(enabledButton); + }); + + it("handles deeply nested structure with mixed content", () => { + const root = document.createElement("div"); + + // Level 1 + const section1 = document.createElement("section"); + const disabledInput = document.createElement("input"); + disabledInput.disabled = true; + section1.appendChild(disabledInput); + + // Level 2 + const section2 = document.createElement("section"); + const article = document.createElement("article"); + const focusableButton = document.createElement("button"); + article.appendChild(focusableButton); + section2.appendChild(article); + + root.appendChild(section1); + root.appendChild(section2); + + expect(findFirstFocusableNode([root])).toBe(focusableButton); + }); + }); + + describe("edge cases", () => { + it("handles single text node", () => { + const textNode = document.createTextNode("text"); + expect(findFirstFocusableNode([textNode])).toBeNull(); + }); + + it("handles mixed node types", () => { + const textNode = document.createTextNode("text"); + const commentNode = document.createComment("comment"); + const button = document.createElement("button"); + + expect(findFirstFocusableNode([textNode, commentNode, button])).toBe(button); + }); + + it("handles elements with conflicting attributes", () => { + const input = document.createElement("input"); + input.type = "text"; + input.disabled = false; // property says enabled + input.setAttribute("disabled", ""); // attribute says disabled + + // Based on shouldFocus logic, this should be non-focusable due to attribute + const button = document.createElement("button"); + + expect(findFirstFocusableNode([input, button])).toBe(button); + }); + }); +}); diff --git a/libs/web-components/src/common/utils.ts b/libs/web-components/src/common/utils.ts index d83e032db4..40b5d52afc 100644 --- a/libs/web-components/src/common/utils.ts +++ b/libs/web-components/src/common/utils.ts @@ -386,3 +386,110 @@ export function getLocalDateValues(input: string | Date): { return null; } + +/** + * Check if a node is focusable + * @param node + * @return boolean + */ +export function isFocusable(node: Node): boolean { + const element = node as HTMLElement; + + // 1 = element_node (div, span, input, a, ...) + if (element.nodeType !== 1) return false; + + // Skip elements with data-ignore-focus attribute + if (element.getAttribute?.("data-ignore-focus")) return false; + + const isTabbable = + element.tabIndex > 0 || + (element.tabIndex === 0 && element.getAttribute("tabindex") !== null); + if (isTabbable) return true; + + if (("disabled" in element && element.disabled) || element?.getAttribute("disabled")) return false; + + // Allow elements with data-should-focus to be focusable even with tabindex=-1 + if (element.getAttribute?.("data-should-focus")) return true; + + if (element.tabIndex < 0 || element.getAttribute?.("tabindex") === "-1") + return false; + + switch (element.nodeName) { + case "A": { + const el = element as HTMLLinkElement; + if (el.href && el.rel !== "ignore") { + return true; + } + break; + } + case "INPUT": { + const el = element as HTMLInputElement; + if (el.type !== "hidden" && el.type !== "file") { + return true; + } + break; + } + case "BUTTON": + case "SELECT": + case "TEXTAREA": + return true; + } + + return false; +} + +/** + * return the first focusable element of nodes list (including each node's shadow/slot) + * @param nodes + * @param reversed + */ +export function findFirstFocusableNode( + nodes: NodeList | Node[], + reversed = false, +): Node | null { + let focusableNode = null; + + const nodeList = reversed ? [...nodes].reverse() : nodes; + for (const node of nodeList) { + // Check shadow DOM first before considering the host element focusable + if (node instanceof HTMLElement && node.shadowRoot) { + focusableNode = findFirstNodeOfShadowDOM(node, reversed); + if (focusableNode) break; + } + + if (node.hasChildNodes()) { + focusableNode = findFirstFocusableNode(Array.from(node.childNodes), reversed); + if (focusableNode) break; + } + + // Check slot content + focusableNode = findFirstNodeOfSlot(node, reversed); + if (focusableNode) break; + + // Finally, check if the node itself is focusable (but only if no focusable content was found inside) + if (isFocusable(node)) { + focusableNode = node; + break; + } + } + + return focusableNode; +} + +function findFirstNodeOfSlot( + node: Node, + reversed: boolean, +): Node | null { + if (!(node instanceof HTMLSlotElement)) return null; + return findFirstFocusableNode([...node.assignedNodes()], reversed); +} + +function findFirstNodeOfShadowDOM( + node: Node, + reversed: boolean, +): Node | null { + if (!(node instanceof HTMLElement)) return null; + return findFirstFocusableNode([...(node.shadowRoot?.childNodes || [])], reversed); +} + + diff --git a/libs/web-components/src/components/accordion/Accordion.svelte b/libs/web-components/src/components/accordion/Accordion.svelte index 12c70b9755..4fefe5d9b0 100644 --- a/libs/web-components/src/components/accordion/Accordion.svelte +++ b/libs/web-components/src/components/accordion/Accordion.svelte @@ -58,7 +58,7 @@ validateRequired("GoAAccordion", { heading }); validateHeadingSize(headingsize); ensureSlotExists(_slotEl); - + _headingSlotChildren = getHeadingChildren(); _accordionId = `accordion-${generateRandomId()}`; }); @@ -117,8 +117,8 @@ {/if} @@ -142,8 +142,8 @@ {/if} @@ -182,7 +182,7 @@ } summary { - min-height: 3.5rem; + min-height: var(--goa-accordion-heading-min-height, 3.5rem); padding: var(--goa-accordion-padding-heading-icon-left); border: var(--goa-accordion-border); border-radius: var(--goa-accordion-border-radius); @@ -203,6 +203,7 @@ summary:hover { background-color: var(--goa-accordion-color-bg-heading-hover); + border: var(--goa-accordion-border-hover, var(--goa-accordion-border)); color: var(--goa-accordion-color-heading-hover); } summary:focus-visible, @@ -242,16 +243,16 @@ } .heading { - font: var(--goa-accordion-heading-s); + font: var(--goa-accordion-heading); padding-right: 1rem; } .secondary-text { - font: var(--goa-typography-body-s); + font: var(--goa-accordion-heading-secondary-text, var(--goa-typography-body-s)); + color: var(--goa-accordion-heading-secondary-text-color, var(--goa-color-text-default)); line-height: 1.5rem; padding-right: 1rem; } - .heading-content { flex: 1; } @@ -261,7 +262,7 @@ } .container-medium { - min-height: 4rem; + min-height: var(--goa-accordion-heading-m-min-height, 4rem); } .container-medium goa-icon { @@ -291,12 +292,33 @@ border-bottom: var(--goa-accordion-divider); } + details[open] summary:hover { + border-bottom: var(--goa-accordion-divider-hover, var(--goa-accordion-divider)); + } + + details[open] summary:focus-visible::before { + border-radius: var(--goa-accordion-border-radius-focus, var(--goa-accordion-border-radius)); + } + + /* Sizes */ .heading-medium { line-height: 2rem; font: var(--goa-accordion-heading-m); } + .heading-medium + .secondary-text { + font: var(--goa-accordion-heading-m-secondary-text, var(--goa-typography-body-s)); + } + + .container-medium { + padding: var(--goa-accordion-padding-heading-m-icon-left, var(--goa-accordion-padding-heading-icon-left)); + } + + .container-medium.iconRight { + padding: var(--goa-accordion-padding-heading-m-icon-right, var(--goa-accordion-padding-heading-icon-right)); + } + @container self (--mobile) { .content { padding: var(--goa-accordion-padding-content-narrow); diff --git a/libs/web-components/src/components/app-header/AppHeader.svelte b/libs/web-components/src/components/app-header/AppHeader.svelte index 6172bf643d..165967aee2 100644 --- a/libs/web-components/src/components/app-header/AppHeader.svelte +++ b/libs/web-components/src/components/app-header/AppHeader.svelte @@ -548,9 +548,7 @@ /* Header nav item with children (app header menu) --Hover */ .desktop :global(::slotted(goa-app-header-menu:hover)) { background: var(--goa-app-header-color-bg-nav-item-hover); - cursor: pointer; - color: var(--goa-app-header-color-text-nav-item-hover) !important; - overflow: hidden !important; + color: var(--goa-app-header-color-text-nav-item-hover); } /* Link item styling */ diff --git a/libs/web-components/src/components/badge/Badge.svelte b/libs/web-components/src/components/badge/Badge.svelte index ed0ac5d79f..6569984ef9 100644 --- a/libs/web-components/src/components/badge/Badge.svelte +++ b/libs/web-components/src/components/badge/Badge.svelte @@ -8,7 +8,8 @@ import { typeValidator, toBoolean } from "../../common/utils"; import type { GoAIconType } from "../icon/Icon.svelte"; - // Validator + + // Validators const [Types, validateType] = typeValidator( "Badge type", [ @@ -39,12 +40,36 @@ "red-light", "violet-light", "yellow-light", + "sky", + "prairie", + "lilac", + "pasture", + "sunset", + "dawn", + "default", ], true, ); + const [badgeSizes, validateBadgeSize] = typeValidator("Badge size", [ + "medium", + "large", + ]); + + const [versions, validateVersion] = typeValidator("Badge version", [ + "1", + "2", + ]); + + const [emphasisLevels, validateEmphasisLevel] = typeValidator( + "Badge emphasis level", + ["subtle", "strong"], + ); + //Type type BadgeType = (typeof Types)[number]; + type BadgeSize = (typeof badgeSizes)[number]; + type BadgeVersion = (typeof versions)[number]; export let type: BadgeType; @@ -54,6 +79,9 @@ export let icon: string = ""; export let icontype: GoAIconType | null = null; export let arialabel: string = ""; + export let size: BadgeSize = "medium"; + export let emphasis: (typeof emphasisLevels)[number] = "strong"; + export let version: BadgeVersion = "1"; // margin export let mt: Spacing = null; @@ -94,10 +122,20 @@ "red-light": "information-circle", "violet-light": "information-circle", "yellow-light": "information-circle", + sky: "information-circle", + prairie: "information-circle", + lilac: "information-circle", + pasture: "information-circle", + sunset: "information-circle", + dawn: "information-circle", + default: "information-circle", }[type]; onMount(() => { validateType(type); + validateBadgeSize(size); + validateEmphasisLevel(emphasis); + validateVersion(version); if (!showIcon && !content) { console.warn( @@ -115,15 +153,16 @@ style={calculateMargin(mt, mr, mb, ml)} data-testid={testid} data-type="goa-badge" - class="goa-badge badge-{type}" + class="goa-badge badge-{type} badge-{size} badge-{emphasis}" class:icon-only={showIconOnly} + class:v2={version === "2"} > {#if showIcon} {:else}
@@ -207,8 +246,14 @@ } .goa-badge.badge-archived { - background-color: var(--goa-color-greyscale-700); - color: var(--goa-badge-dark-color-content); + background-color: var( + --goa-badge-archived-color-bg, + var(--goa-color-greyscale-700) + ); + color: var( + --goa-badge-archived-color-content, + var(--goa-badge-dark-color-content) + ); } .goa-badge.badge-aqua { @@ -305,4 +350,133 @@ background-color: var(--goa-color-extended-light-yellow); color: var(--goa-badge-light-color-content); } + + .v2 .goa-badge-content { + padding-bottom: 0; + } + + /* Version 2: Default Colours */ + .v2.badge-default { + background-color: var(--goa-badge-default-color-bg); + color: var(--goa-badge-default-color-content); + } + + .v2.badge-default.badge-subtle { + background-color: var(--goa-badge-default-subtle-color-bg); + box-shadow: var(--goa-badge-default-subtle-border); + color: var(--goa-badge-default-subtle-color-content); + } + + .v2.goa-badge.badge-archived.badge-subtle { + background-color: var(--goa-badge-archived-subtle-color-bg); + box-shadow: var(--goa-badge-archived-subtle-border); + color: var(--goa-badge-archived-subtle-color-content); + } + + /* Version 2: Extended Colours */ + + .v2.badge-sky { + background-color: var(--goa-color-extended-sky-default); + color: var(--goa-color-extended-sky-text); + } + + .v2.badge-prairie { + background-color: var(--goa-color-extended-prairie-default); + color: var(--goa-color-extended-prairie-text); + } + + .v2.badge-lilac { + background-color: var(--goa-color-extended-lilac-default); + color: var(--goa-color-extended-lilac-text); + } + + .v2.badge-pasture { + background-color: var(--goa-color-extended-pasture-default); + color: var(--goa-color-extended-pasture-text); + } + + .v2.badge-sunset { + background-color: var(--goa-color-extended-sunset-default); + color: var(--goa-color-extended-sunset-text); + } + + .v2.badge-dawn { + background-color: var(--goa-color-extended-dawn-default); + color: var(--goa-color-extended-dawn-text); + } + + .v2.badge-subtle.badge-sky { + background-color: var(--goa-color-extended-sky-light); + box-shadow: var(--goa-color-extended-sky-subtle-border); + color: var(--goa-color-extended-sky-text); + } + + .v2.badge-subtle.badge-prairie { + background-color: var(--goa-color-extended-prairie-light); + box-shadow: var(--goa-color-extended-prairie-subtle-border); + color: var(--goa-color-extended-prairie-text); + } + + .v2.badge-subtle.badge-lilac { + background-color: var(--goa-color-extended-lilac-light); + box-shadow: var(--goa-color-extended-lilac-subtle-border); + color: var(--goa-color-extended-lilac-text); + } + + .v2.badge-subtle.badge-pasture { + background-color: var(--goa-color-extended-pasture-light); + box-shadow: var(--goa-color-extended-pasture-subtle-border); + color: var(--goa-color-extended-pasture-text); + } + + .v2.badge-subtle.badge-sunset { + background-color: var(--goa-color-extended-sunset-light); + box-shadow: var(--goa-color-extended-sunset-subtle-border); + color: var(--goa-color-extended-sunset-text); + } + + .v2.badge-subtle.badge-dawn { + background-color: var(--goa-color-extended-dawn-light); + box-shadow: var(--goa-color-extended-dawn-subtle-border); + color: var(--goa-color-extended-dawn-text); + } + + /* Version 2: Subtle emphasis for standard colours */ + + .v2.goa-badge.badge-subtle.badge-information { + background-color: var(--goa-badge-info-subtle-color-bg); + color: var(--goa-badge-info-subtle-color-content); + box-shadow: var(--goa-badge-info-subtle-border); + } + + .v2.goa-badge.badge-subtle.badge-success { + background-color: var(--goa-badge-success-subtle-color-bg); + color: var(--goa-badge-success-subtle-color-content); + box-shadow: var(--goa-badge-success-subtle-border); + } + + .v2.goa-badge.badge-subtle.badge-important { + background-color: var(--goa-badge-important-subtle-color-bg); + color: var(--goa-badge-important-subtle-color-content); + box-shadow: var(--goa-badge-important-subtle-border); + } + + .v2.goa-badge.badge-subtle.badge-emergency { + background-color: var(--goa-badge-emergency-subtle-color-bg); + color: var(--goa-badge-emergency-subtle-color-content); + box-shadow: var(--goa-badge-emergency-subtle-border); + } + + /* Version 2: Large size */ + + .v2.goa-badge.badge-large { + height: var(--goa-badge-height-large); + padding: var(--goa-badge-padding-large); + --goa-icon-size: var(--goa-badge-icon-size-large); + } + + .v2.goa-badge.badge-large .goa-badge-content { + font-size: var(--goa-badge-font-size-large); + line-height: var(--goa-badge-line-height-large); + } diff --git a/libs/web-components/src/components/block/Block.svelte b/libs/web-components/src/components/block/Block.svelte index e6ca0f3583..a03bbafa23 100644 --- a/libs/web-components/src/components/block/Block.svelte +++ b/libs/web-components/src/components/block/Block.svelte @@ -1,9 +1,12 @@ - + @@ -318,8 +297,8 @@ data-testid={testid} tabindex="-1" > - - + + {#each _months as month, i} - + {/each} - + {#each _years as year} @@ -364,49 +347,46 @@
Sat
{#each _previousMonthDays as d} {/each} {#each _monthDays as d} {/each} {#each _nextMonthDays as d} {/each}
@@ -415,7 +395,7 @@ diff --git a/libs/web-components/src/components/checkbox/Checkbox.svelte b/libs/web-components/src/components/checkbox/Checkbox.svelte index 87b3224196..eec0d0c4ad 100644 --- a/libs/web-components/src/components/checkbox/Checkbox.svelte +++ b/libs/web-components/src/components/checkbox/Checkbox.svelte @@ -39,11 +39,13 @@ export let description: string = ""; export let revealarialabel: string = ""; // screen reader will announce this when reveal slot is displayed export let maxwidth: string = "none"; + export let size: "default" | "compact" = "default"; + export let version: "1" | "2" = "1"; // margin export let mt: Spacing = null; export let mr: Spacing = null; - export let mb: Spacing = "m"; + export let mb: Spacing = null; export let ml: Spacing = null; // Private @@ -84,6 +86,7 @@ // hold on to the initial value to prevent losing it on check changes _value = value; _descriptionId = `description_${name}`; + mb ??= size === "compact" ? "s" : "m"; addRelayListener(); addRevealSlotListener(); @@ -165,12 +168,12 @@ const checkboxEl = (_rootEl?.getRootNode() as ShadowRoot)?.host as HTMLElement; const fromCheckboxList = checkboxEl?.closest("goa-checkbox-list") !== null; - relay( - _rootEl, - FormFieldMountMsg, - { name, el: _rootEl }, - { bubbles: !fromCheckboxList, timeout: 10 }, - ); + relay( + _rootEl, + FormFieldMountMsg, + { name, el: _rootEl }, + { bubbles: !fromCheckboxList, timeout: 10 }, + ); } function onChange(e: Event) { @@ -244,6 +247,8 @@
- {#if isIndeterminate} + {#if isIndeterminate && version === "2"} + + + + {:else if isIndeterminate} + {:else if isChecked && version === "2"} + + + {:else if isChecked} diff --git a/libs/web-components/src/components/container/Container.spec.ts b/libs/web-components/src/components/container/Container.spec.ts index 2be63d98a3..941a36e3a9 100644 --- a/libs/web-components/src/components/container/Container.spec.ts +++ b/libs/web-components/src/components/container/Container.spec.ts @@ -1,10 +1,9 @@ import { render } from "@testing-library/svelte"; -import GoAContainerWrapper from "./ContainerWrapper.test.svelte" +import GoAContainerWrapper from "./ContainerWrapper.test.svelte"; import GoAContainer from "./Container.svelte"; import { it, describe } from "vitest"; describe("GoA Container", () => { - it("should render", async () => { render(GoAContainerWrapper, { title: "Test Title", @@ -31,17 +30,33 @@ describe("GoA Container", () => { const container = await baseElement.findByTestId("container-test"); expect(container).toBeTruthy(); - expect(container?.classList).toContain('width--content'); + expect(container?.classList).toContain("width--content"); + }); + it("should set a max width", async () => { + const baseElement = render(GoAContainer, { + testid: "container-test", + maxWidth: "480px", + }); + const container = await baseElement.findByTestId("container-test"); + expect(container?.getAttribute("style")).toContain("max-width: 480px;"); }); + }); - it('should set a max width', async () => { + describe("Heights", () => { + it("should set min and max heights when provided", async () => { const baseElement = render(GoAContainer, { testid: "container-test", - maxwidth: "480px", + minHeight: "120px", + maxHeight: "360px", }); const container = await baseElement.findByTestId("container-test"); - expect(container?.getAttribute("style")).toContain("max-width: 480px;") + const computedStyle = window.getComputedStyle(container); + expect(container?.getAttribute("style")).toContain("min-height: 120px;"); + expect(container?.getAttribute("style")).toContain("max-height: 360px;"); + expect(computedStyle.alignSelf).toBe("flex-start"); + const content = container?.querySelector(".content"); + expect(content).not.toBeNull(); }); }); diff --git a/libs/web-components/src/components/container/Container.svelte b/libs/web-components/src/components/container/Container.svelte index f811d60cd5..015a521a1f 100644 --- a/libs/web-components/src/components/container/Container.svelte +++ b/libs/web-components/src/components/container/Container.svelte @@ -1,4 +1,13 @@ - +
+ + {#if _showIcon && _showKeyboardIcon} + + {/if} +
diff --git a/libs/web-components/src/components/data-grid/DataGridTestComponent.svelte b/libs/web-components/src/components/data-grid/DataGridTestComponent.svelte new file mode 100644 index 0000000000..2ea5951f46 --- /dev/null +++ b/libs/web-components/src/components/data-grid/DataGridTestComponent.svelte @@ -0,0 +1,60 @@ + + + + +
+
Name
+
Age
+
City
+
+ + +
+
John Doe
+
30
+
Edmonton
+
+ + +
+
Jane Smith
+
25
+
Calgary
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+ +
+
diff --git a/libs/web-components/src/components/date-picker/DatePicker.svelte b/libs/web-components/src/components/date-picker/DatePicker.svelte index 2c0ce4014a..7b3b256309 100644 --- a/libs/web-components/src/components/date-picker/DatePicker.svelte +++ b/libs/web-components/src/components/date-picker/DatePicker.svelte @@ -8,10 +8,9 @@ /> - +
-
+
{#if heading || $$slots.heading} {#if heading} {heading} @@ -224,7 +191,7 @@
@@ -240,7 +207,6 @@ class="drawer-actions" data-testid="drawer-actions" class:empty-actions={!_actionsSlotHasContent} - bind:clientHeight={_actionsHeight} > @@ -323,6 +289,12 @@ /* Content styles */ .drawer-content { box-shadow: none; + flex: 1 1 auto; + min-height: 0; + } + + .drawer-content goa-scrollable { + height: 100%; } .scroll-content { @@ -351,12 +323,17 @@ .drawer-bottom { bottom: var(--drawer-offset); width: 100%; - height: 300px; + min-height: 300px; border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem; transform: translateY(100%); box-shadow: var(--goa-drawer-bottom-shadow); } + + .drawer-bottom .drawer-content { + overflow-y: auto; + } + .drawer-open-bottom { bottom: 0; } diff --git a/libs/web-components/src/components/dropdown/Dropdown.svelte b/libs/web-components/src/components/dropdown/Dropdown.svelte index 6f9acadd78..3503d5fe99 100644 --- a/libs/web-components/src/components/dropdown/Dropdown.svelte +++ b/libs/web-components/src/components/dropdown/Dropdown.svelte @@ -66,6 +66,9 @@ export let error: string = "false"; export let multiselect: string = "false"; export let native: string = "false"; + export let size: "default" | "compact" = "default"; + export let version: "1" | "2" = "1"; + /*** * @deprecated This property has no effect and will be removed in a future version */ @@ -105,8 +108,6 @@ let _bindTimeoutId: any; - let _mountStatus: "active" | "ready" = "ready"; - let _mountTimeoutId: any = undefined; let _error = toBoolean(error); let _prevError = _error; @@ -291,6 +292,10 @@ syncFilteredOptions(); if (!_native) { setSelected(); + // Update the displayed value after options are loaded and selected option is set + if (_inputEl && _selectedOption) { + setDisplayedValue(); + } } }, 1); } @@ -301,6 +306,7 @@ */ function onChildDestroyed(detail: DropdownItemDestroyRelayDetail) { _options = _options.filter((option) => option.value !== detail.value); + syncFilteredOptions(); } function setSelected() { @@ -460,7 +466,8 @@ // update the value show to the user in the element function setDisplayedValue() { - _inputEl.value = _selectedOption?.label || _selectedOption?.value || ""; + const newValue = _selectedOption?.label || _selectedOption?.value || ""; + _inputEl.value = newValue; } function dispatchValue(newValue?: string) { @@ -636,6 +643,11 @@ } onKeyUp(_: KeyboardEvent) { + // Clear selection and highlight if input becomes empty + if (this.input.value === "" && _selectedOption) { + _selectedOption = undefined; + _highlightedIndex = -1; + } showMenu(); } @@ -744,6 +756,8 @@ data-testid={testid || `${name}-dropdown`} class="dropdown" class:dropdown-native={_native} + class:compact={size === "compact"} + class:v2={version === "2"} style={` ${calculateMargin(mt, mr, mb, ml)}; --width: ${_width}; @@ -791,6 +805,7 @@ {/if} @@ -817,7 +832,7 @@ aria-haspopup="listbox" disabled={_disabled} readonly={!_filterable} - {placeholder} + placeholder={placeholder || (version === "2" ? "—Select—" : "")} {name} on:keydown={onInputKeyDown} on:keyup={onInputKeyUp} @@ -835,7 +850,8 @@ on:keydown={onClearIconKeyDown} class="dropdown-icon--clear" class:disabled={_disabled} - size="medium" + disabled={_disabled ? "true" : "false"} + size={size === "compact" ? "xsmall" : "medium"} theme="filled" variant="dark" icon="close" @@ -846,7 +862,7 @@ testid="chevron" id={name} class="dropdown-icon--arrow" - size="medium" + size={size === "compact" ? "small" : "medium"} type={_isMenuVisible ? "chevron-up" : "chevron-down"} /> {/if} @@ -926,20 +942,28 @@ cursor: pointer; width: 100%; } + .dropdown-input-group:hover { box-shadow: var(--goa-dropdown-border-hover); border: none; } - .dropdown-input-group:has(input:focus-visible) { + + .dropdown-input-group:has(input:focus-visible), + .dropdown-input-group.error:has(:focus-visible) { box-shadow: var(--goa-dropdown-border), var(--goa-dropdown-border-focus); } + + /* V2: Focus state has a single border */ + .v2 .dropdown-input-group:has(input:focus-visible), + .v2 .dropdown-input-group.error:has(:focus-visible) { + box-shadow: var(--goa-dropdown-border-focus); + } + .dropdown-input-group.error, .dropdown-input-group.error:hover { box-shadow: var(--goa-dropdown-border-error); } - .dropdown-input-group.error:has(:focus-visible) { - box-shadow: var(--goa-dropdown-border), var(--goa-dropdown-border-focus); - } + @container not (--mobile) { .dropdown-input-group { width: var(--width, 100%); @@ -1005,9 +1029,9 @@ /** menu **/ ul[role="listbox"] { - border-radius: var(--goa-dropdown-border-radius); + border-radius: var(--goa-dropdown-menu-border-radius, var(--goa-dropdown-border-radius)); padding: 0; - margin: 0; + margin: var(--goa-dropdown-menu-margin, 0); } /* dropdown items */ @@ -1021,8 +1045,10 @@ white-space: normal; /* Allows text to wrap */ word-break: break-word; /* Ensures long words break onto the next line */ overflow-wrap: break-word; /* Alternative for word wrapping */ + border-radius: var(--goa-dropdown-item-border-radius, 0); } + .dropdown-item:hover, .dropdown-item--highlighted { background: var(--goa-dropdown-item-color-bg-hover); @@ -1078,8 +1104,9 @@ .dropdown-native::after { content: ""; position: absolute; - right: 0.6rem; - top: 0.6rem; + right: var(--goa-dropdown-space-icon-text); + top: 50%; + transform: translateY(-50%); pointer-events: none; width: 1.5rem; height: 1.5rem; @@ -1099,4 +1126,20 @@ color: var(--goa-dropdown-color-text-placeholder); opacity: 1; } + + input:disabled::placeholder { + color: var(--goa-dropdown-color-text-disabled); + } + + /* Compact Size */ + .compact input, + .compact select { + padding: var(--goa-dropdown-compact-padding); + height: var(--goa-dropdown-compact-height); + font: var(--goa-dropdown-compact-typography); + } + + .compact .dropdown-item { + font: var(--goa-dropdown-compact-item-typography); + } diff --git a/libs/web-components/src/components/dropdown/DropdownItem.svelte b/libs/web-components/src/components/dropdown/DropdownItem.svelte index 1a82b0d308..0bec548db8 100644 --- a/libs/web-components/src/components/dropdown/DropdownItem.svelte +++ b/libs/web-components/src/components/dropdown/DropdownItem.svelte @@ -62,7 +62,7 @@ }) } - onDestroy(async () => { + onDestroy(() => { relay( _parentEl, DropdownItemDestroyMsg, diff --git a/libs/web-components/src/components/filter-chip/FilterChip.spec.ts b/libs/web-components/src/components/filter-chip/FilterChip.spec.ts index afa32b35d1..99502d5fce 100644 --- a/libs/web-components/src/components/filter-chip/FilterChip.spec.ts +++ b/libs/web-components/src/components/filter-chip/FilterChip.spec.ts @@ -43,7 +43,9 @@ describe("FilterChip", () => { }); const chip = container.querySelector(".chip"); - expect(chip).toHaveStyle("min-width: 56px"); + expect(chip).toHaveStyle( + "min-width: var(--goa-filter-chip-min-width, 56px)", + ); }); it("should have an unfilled close icon by default for deletable chips", async () => { diff --git a/libs/web-components/src/components/filter-chip/FilterChip.svelte b/libs/web-components/src/components/filter-chip/FilterChip.svelte index 32d2fb92f7..536883300c 100644 --- a/libs/web-components/src/components/filter-chip/FilterChip.svelte +++ b/libs/web-components/src/components/filter-chip/FilterChip.svelte @@ -5,6 +5,7 @@ import { toBoolean } from "../../common/utils"; import type { Spacing } from "../../common/styling"; import { calculateMargin } from "../../common/styling"; + import type { GoAIconType } from "../icon/Icon.svelte"; // margin export let mt: Spacing = null; @@ -15,8 +16,11 @@ // Props export let error: string = "false"; export let content: string; + export let secondarytext: string = ""; + export let leadingicon: GoAIconType | null = null; export let testid: string = ""; export let ariaLabel: string = ""; + export let version: "1" | "2" = "1"; // Private variables let el: HTMLElement; @@ -47,53 +51,108 @@ -
(_hovering = true)} - on:mouseout={() => (_hovering = false)} - on:focus={() => (_focused = true)} - on:blur={() => (_focused = false)} -> -
- {content} +{#if version === "2"} + - -
+{:else} +
(_hovering = true)} + on:mouseout={() => (_hovering = false)} + on:focus={() => (_focused = true)} + on:blur={() => (_focused = false)} + > +
+ {content} +
+ +
+{/if} diff --git a/libs/web-components/src/components/focus-trap/FocusTrap.svelte b/libs/web-components/src/components/focus-trap/FocusTrap.svelte index 8fa4376e8d..07ca2eeca5 100644 --- a/libs/web-components/src/components/focus-trap/FocusTrap.svelte +++ b/libs/web-components/src/components/focus-trap/FocusTrap.svelte @@ -12,6 +12,7 @@
- + - +
diff --git a/libs/web-components/src/components/form-stepper/FormStepper.svelte b/libs/web-components/src/components/form-stepper/FormStepper.svelte index 3bcd1e9865..ce23454382 100644 --- a/libs/web-components/src/components/form-stepper/FormStepper.svelte +++ b/libs/web-components/src/components/form-stepper/FormStepper.svelte @@ -102,7 +102,7 @@ onDestroy(() => { window.removeEventListener("orientationchange", calcStepDimensions); - resizeObserver.unobserve(_rootEl); + resizeObserver?.unobserve(_rootEl); }); // ==== diff --git a/libs/web-components/src/components/form-stepper/form-stepper.spec.ts b/libs/web-components/src/components/form-stepper/form-stepper.spec.ts index 7847147417..002dcd7047 100644 --- a/libs/web-components/src/components/form-stepper/form-stepper.spec.ts +++ b/libs/web-components/src/components/form-stepper/form-stepper.spec.ts @@ -1,82 +1,83 @@ -import FormStepper from './FormStepperWrapper.test.svelte' -import { fireEvent, render, waitFor } from '@testing-library/svelte' -import { tick } from 'svelte'; -import { it, describe } from "vitest"; +import FormStepper from "./FormStepperWrapper.test.svelte"; +import { fireEvent, render, waitFor } from "@testing-library/svelte"; +import { tick } from "svelte"; +import { vi, it, describe, beforeAll } from "vitest"; function getProgress(el: Element): number { - const progress = el.querySelector("progress.horizontal") + const progress = el.querySelector("progress.horizontal"); return +(progress?.getAttribute("value") ?? "-1"); } beforeAll(() => { - const ResizeObserverMock = vi.fn(() => ({ - observe: vi.fn(), - unobserve: vi.fn(), - disconnect: vi.fn(), - })); + class ResizeObserverMock { + observe = vi.fn(); + unobserve = vi.fn(); + disconnect = vi.fn(); + } // Stub the global ResizeObserver - vi.stubGlobal('ResizeObserver', ResizeObserverMock); -}) + vi.stubGlobal("ResizeObserver", ResizeObserverMock); +}); describe("FormStepper", () => { it("it renders", async () => { - const { container } = render(FormStepper) + const { container } = render(FormStepper); await waitFor(() => { - const steps = container.querySelectorAll("button") - expect(steps.length).toBe(4) - }) - }) + const steps = container.querySelectorAll("button"); + expect(steps.length).toBe(4); + }); + }); it("show progress updates on step changes", async () => { - const { container } = render(FormStepper) + const { container } = render(FormStepper); const steps = container.querySelectorAll("button[type=button]"); await waitFor(() => { - expect(steps.length).toBe(4) - expect(getProgress(container)).toBe(0) - }) + expect(steps.length).toBe(4); + expect(getProgress(container)).toBe(0); + }); for (const [i, step] of [...steps].entries()) { - await fireEvent.click(step) + await fireEvent.click(step); await waitFor(() => { const result = Math.floor(getProgress(container)); - const expected = Math.floor(100 / (steps.length - 1) * i); + const expected = Math.floor((100 / (steps.length - 1)) * i); expect(result).toEqual(expected); }); } - }) + }); it("sets the attributes on the children", async () => { - const { container } = render(FormStepper) + const { container } = render(FormStepper); const steps = container.querySelectorAll("goa-form-step"); - await tick() + await tick(); steps.forEach(async (step: Element, index: number) => { - expect(step.getAttribute("arialabel")).toBe(`Step ${index + 1} of ${steps.length}`) - expect(step.getAttribute("childindex")).toBe(`${index + 1}`) - }) - }) + expect(step.getAttribute("arialabel")).toBe( + `Step ${index + 1} of ${steps.length}`, + ); + expect(step.getAttribute("childindex")).toBe(`${index + 1}`); + }); + }); it("enables all steps if no initial step is set", async () => { - const { container } = render(FormStepper) + const { container } = render(FormStepper); const steps = container.querySelectorAll("goa-form-step"); - await tick() + await tick(); steps.forEach((step: Element) => { - expect(step.getAttribute("enabled")).toBe("true") - }) - }) + expect(step.getAttribute("enabled")).toBe("true"); + }); + }); it("enables all steps up to, and including, initial step that is set", async () => { - const { container } = render(FormStepper, { step: 2 }) + const { container } = render(FormStepper, { step: 2 }); await waitFor(() => { const steps = container.querySelectorAll("button[type=button]"); steps.forEach((step: Element, index: number) => { - expect(step.getAttribute("disabled")).toBe(index + 1 <= 2 ? null : "") - }) - }) - }) -}) - + expect(step.getAttribute("disabled")).toBe(index + 1 <= 2 ? null : ""); + }); + }); + }); +}); diff --git a/libs/web-components/src/components/icon-button/IconButton.svelte b/libs/web-components/src/components/icon-button/IconButton.svelte index da6a1014cc..2bfdba4337 100644 --- a/libs/web-components/src/components/icon-button/IconButton.svelte +++ b/libs/web-components/src/components/icon-button/IconButton.svelte @@ -104,7 +104,7 @@ } .goa-icon-button--small { - padding: var(--goa-icon-button-medium-padding); + padding: var(--goa-icon-button-small-padding, var(--goa-icon-button-medium-padding)); } .goa-icon-button--medium { @@ -115,10 +115,6 @@ padding: var(--goa-icon-button-large-padding); } - .goa-icon-button--xlarge { - padding: var(--goa-icon-button-large-padding); - } - button { display: inline-flex; align-items: center; @@ -127,9 +123,7 @@ background: transparent; cursor: pointer; border: none; - border-radius: var(--goa-icon-button-medium-border-radius); - padding: var(--padding); - cursor: pointer; + border-radius: var(--goa-icon-button-border-radius, var(--goa-icon-button-medium-border-radius)); transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, transform 0.1s ease-in-out; @@ -144,7 +138,7 @@ } button:focus-visible { - box-shadow: 0 0 0 3px var(--goa-color-interactive-focus); + box-shadow: 0 0 0 var(--goa-icon-button-focus-border-width, 3px) var(--goa-icon-button-focus-border-color, var(--goa-color-interactive-focus)); outline: none; } @@ -165,8 +159,7 @@ fill: var(--goa-icon-button-default-color); } - .color:hover, - .color:focus-visible { + .color:hover:not(:focus-visible) { color: var(--goa-icon-button-default-hover-color); fill: var(--goa-icon-button-default-hover-color); background-color: var(--goa-icon-button-default-hover-color-bg); @@ -183,15 +176,14 @@ fill: var(--goa-icon-button-dark-color); } - .dark:hover, - .dark:focus-visible, + .dark:hover:not(:focus-visible), .dark:active { background-color: var(--goa-icon-button-dark-hover-color-bg); } .dark:disabled { - color: var(--goa-icon-button-dark-disabled-color-bg); - fill: var(--goa-icon-button-dark-disabled-color-bg); + color: var(--goa-icon-button-dark-disabled-color, var(--goa-icon-button-dark-disabled-color-bg)); + fill: var(--goa-icon-button-dark-disabled-color, var(--goa-icon-button-dark-disabled-color-bg)); } /* Type: nocolor (same as dark, not documented) */ @@ -200,8 +192,7 @@ fill: var(--goa-icon-button-dark-color); } - .nocolor:hover, - .nocolor:focus-visible, + .nocolor:hover:not(:focus-visible), .nocolor:active { background-color: var(--goa-icon-button-dark-hover-color-bg); } @@ -212,9 +203,10 @@ fill: var(--goa-icon-button-destructive-color); } - .destructive:hover, - .destructive:focus-visible, + .destructive:hover:not(:focus-visible), .destructive:active { + color: var(--goa-icon-button-destructive-hover-color); + fill: var(--goa-icon-button-destructive-hover-color); background-color: var(--goa-icon-button-destructive-hover-color-bg); } @@ -229,8 +221,7 @@ fill: var(--goa-icon-button-light-color); } - .light:hover, - .light:focus-visible, + .light:hover:not(:focus-visible), .light:active { background-color: var(--goa-icon-button-light-hover-color-bg); } @@ -246,8 +237,7 @@ fill: var(--goa-icon-button-light-color); } - .inverted:hover, - .inverted:focus-visible, + .inverted:hover:not(:focus-visible), .inverted:active { background-color: var(--goa-icon-button-light-hover-color-bg); } diff --git a/libs/web-components/src/components/icon/Icon.spec.ts b/libs/web-components/src/components/icon/Icon.spec.ts index 3de48dc35e..d890aff616 100644 --- a/libs/web-components/src/components/icon/Icon.spec.ts +++ b/libs/web-components/src/components/icon/Icon.spec.ts @@ -51,6 +51,31 @@ describe("Icon", () => { }); }); +describe("Icon Theme", () => { + it("should render the filled variant when provided in the type", async () => { + const filled = render(GoAIcon, { + testid: "icon-filled", + type: "ellipse:filled", + }); + + const filledIcon = await filled.findByTestId("icon-filled"); + const filledIonIcon = filledIcon.querySelector("ion-icon"); + + expect(filledIcon.getAttribute("data-type")).toBe("ellipse"); + expect(filledIonIcon?.getAttribute("name")).toBe("ellipse"); // filled variant has no "-outline" + + const outline = render(GoAIcon, { + testid: "icon-outline", + type: "ellipse", + }); + + const outlineIcon = await outline.findByTestId("icon-outline"); + const outlineIonIcon = outlineIcon.querySelector("ion-icon"); + + expect(outlineIonIcon?.getAttribute("name")).toBe("ellipse-outline"); // default outline theme + }); +}); + describe("Icon Sizes", () => { const sizes = [ { @@ -107,6 +132,7 @@ describe("Icon Sizes", () => { it(`should render the correct width and height for size "${size}"`, async () => { const baseElement = render(GoAIcon, { testid: "icon-test", + type: "ellipse", size, }); const icon = await baseElement.findByTestId("icon-test"); diff --git a/libs/web-components/src/components/icon/Icon.svelte b/libs/web-components/src/components/icon/Icon.svelte index d6d94af18a..e0b1fd49ff 100644 --- a/libs/web-components/src/components/icon/Icon.svelte +++ b/libs/web-components/src/components/icon/Icon.svelte @@ -549,6 +549,10 @@ import { style, toBoolean } from "../../common/utils"; import { calculateMargin } from "../../common/styling"; + type GoAIconTypeWithTheme = + | `${GoAIconType}:${IconTheme}` + | `${GoAIconOverridesType}:${IconTheme}`; + export let mt: Spacing = null; export let mr: Spacing = null; export let mb: Spacing = null; @@ -556,7 +560,7 @@ // Required - export let type: GoAIconType & GoAIconOverridesType; + export let type: GoAIconType | GoAIconOverridesType | GoAIconTypeWithTheme; // Optional @@ -572,15 +576,20 @@ export let ariaexpanded: string = ""; export let role: string = "img"; + let _iconType: GoAIconType | GoAIconOverridesType; + let _iconTheme: IconTheme; // Reactive $: _isInverted = toBoolean(inverted); $: _ariaExpanded = toBoolean(ariaexpanded); - $: _iconName = iconName(type, theme); + $: ({ iconType: _iconType, iconTheme: _iconTheme, name: _iconName } = parseProperties( + type, + theme + )); // Private const _iconOverrides: Record< - GoAIconOverridesType & GoAIconOverridesTypeWithTheme, + GoAIconOverridesType | GoAIconOverridesTypeWithTheme, string > = { "goa-file": ` `, @@ -674,15 +683,25 @@ warning: ``, }; - function iconName(type: GoAIconType, theme: IconTheme): string { - if (type) { - const name = - theme === "filled" || (type as string).indexOf("logo") === 0 - ? type - : `${type}-${theme}`; - return name; - } - return ""; + function parseProperties( + type: GoAIconType | GoAIconOverridesType | GoAIconTypeWithTheme, + fallbackTheme: IconTheme + ) { + const [iconType, maybeTheme] = type.split(":"); + const iconTheme = + maybeTheme === "filled" || maybeTheme === "outline" + ? (maybeTheme as IconTheme) + : fallbackTheme; + const name = + iconTheme === "filled" || (type as string).indexOf("logo") === 0 + ? iconType + : `${iconType}-${iconTheme}`; + + return { + iconType: iconType as GoAIconType | GoAIconOverridesType, + iconTheme, + name + }; } @@ -694,7 +713,7 @@ class={`goa-icon goa-icon--${size}`} class:inverted={_isInverted} data-testid={testid} - data-type={type} + data-type={_iconType || type} title={title} style={` ${calculateMargin(mt, mr, mb, ml)} @@ -702,10 +721,12 @@ ${style("--opacity", opacity)}; `} > - {#if type} - {#if type in _iconOverrides} + {#if _iconType} + {#if _iconType in _iconOverrides}
- {@html _iconOverrides[`${type}-${theme}`] || _iconOverrides[type]} + {@html + _iconOverrides[`${_iconType}-${_iconTheme}`] || + _iconOverrides[_iconType]}
{:else} diff --git a/libs/web-components/src/components/input/Input.spec.ts b/libs/web-components/src/components/input/Input.spec.ts index aafcdded4f..a4908d94a5 100644 --- a/libs/web-components/src/components/input/Input.spec.ts +++ b/libs/web-components/src/components/input/Input.spec.ts @@ -217,6 +217,7 @@ describe("GoAInput Component", () => { keypress(); }); + await fireEvent.input(input, { target: { value: "foobar" } }); await fireEvent.keyUp(input, { target: { value: "foobar" }, key: "r" }); await waitFor(() => { expect(change).toBeCalledTimes(1); @@ -231,6 +232,7 @@ describe("GoAInput Component", () => { name: "test-name", testid: "input-test", type: "date", + value: "2024-01-01", }); const input = await findByTestId("input-test"); const change = vi.fn(); @@ -239,7 +241,7 @@ describe("GoAInput Component", () => { change(); }); - await fireEvent.change(input); + await fireEvent.input(input, { target: { value: "2024-01-02" } }); await waitFor(() => { expect(change).toBeCalledTimes(1); }); @@ -305,6 +307,7 @@ describe("GoAInput Component", () => { name: "test-name", testid: "input-test", type: "search", + value: "foo", }); const input = await findByTestId("input-test"); const search = vi.fn(); @@ -313,7 +316,7 @@ describe("GoAInput Component", () => { search(); }); - await fireEvent(input, new Event("search")); + await fireEvent.input(input, { target: { value: "" } }); await waitFor(() => { expect(search).toBeCalledTimes(1); }); @@ -385,7 +388,8 @@ describe("GoAInput Component", () => { ml: "xl", }); const input = await baseElement.findByTestId("input-test"); - const containerElement = baseElement.container.querySelector(".container"); + const containerElement = + baseElement.container.querySelector(".container"); expect(input).toBeTruthy(); expect(containerElement).toBeTruthy(); @@ -440,7 +444,7 @@ describe("GoAInput Component", () => { fn(); }); - await fireEvent.keyUp(input, { target: { value: "foobar" } }); + await fireEvent.input(input, { target: { value: "foobar" } }); await waitFor( () => { expect(fn).not.toBeCalled(); diff --git a/libs/web-components/src/components/input/Input.svelte b/libs/web-components/src/components/input/Input.svelte index e574fe5b1d..8ae99d3dff 100644 --- a/libs/web-components/src/components/input/Input.svelte +++ b/libs/web-components/src/components/input/Input.svelte @@ -98,6 +98,8 @@ export let ml: Spacing = null; export let trailingiconarialabel: string = ""; export let textalign: TextAlign = "left"; + export let size: "default" | "compact" = "default"; + export let version: "1" | "2" = "1"; let _leadingContentSlot = false; let _trailingContentSlot = false; @@ -229,7 +231,7 @@ } function dispatchOnChange(value: string) { - dispatch(_rootEl, "_change", { name, value }, { bubbles: true }); + dispatch(_rootEl, "_change", { name, value: value }, { bubbles: true }); } // Relay message up the chain to allow any parent element to have a reference to the input element @@ -244,7 +246,7 @@ } } - function onKeyUp(e: Event) { + function onInput(e: Event) { const input = e.target as HTMLInputElement; if (!input) return; @@ -264,6 +266,13 @@ }), ); }, debounce); + } + + function onKeyUp(e: Event) { + const input = e.target as HTMLInputElement; + + if (!input) return; + if (isReadonly) return; input.dispatchEvent( new CustomEvent("_keyPress", { @@ -347,6 +356,8 @@ bind:this={_rootEl} class:leading-content={_leadingContentSlot} class:trailing-content={_trailingContentSlot} + class:compact={size === "compact"} + class:v2={version === "2"} > {#if $$slots.leadingContent}
@@ -401,8 +412,8 @@ aria-label={arialabel} aria-labelledby={arialabelledby} aria-invalid={_error ? "true" : "false"} + on:input={onInput} on:keyup={onKeyUp} - on:change={onKeyUp} on:focus={onFocus} on:blur={onBlur} /> @@ -476,7 +487,7 @@ display: inline-flex; align-items: stretch; width: 100%; - height: 42px; + height: var(--goa-text-input-height, 42px); z-index: 1; background-color: var(--goa-text-input-color-bg); /* default border */ @@ -487,7 +498,18 @@ min-width: 0; } - .goa-input:not(.error):hover:not(:has(input:focus-visible)) { + /* V2 Compact size */ + .container.v2.compact { + --goa-text-input-height: var(--goa-text-input-height-compact); + --goa-text-input-padding: var(--goa-text-input-padding-compact); + --goa-text-input-padding-lr: var(--goa-text-input-padding-compact-lr); + --goa-text-input-typography: var(--goa-text-input-typography-compact); + --goa-text-input-space-btw-icon-text: var( + --goa-text-input-space-btw-icon-text-compact + ); + } + + .goa-input:not(.error):not(.input--disabled):hover:not(:has(input:focus-visible)) { /* hover border */ box-shadow: var(--goa-text-input-border-hover); } @@ -510,6 +532,11 @@ var(--goa-text-input-border), var(--goa-text-input-border-focus); } + /* V2: Focus state shows only blue focus border (no default border) */ + .container.v2 .goa-input:has(input:focus-visible) { + box-shadow: var(--goa-text-input-border-focus); + } + /* type=range does not have an outline/box-shadow */ .goa-input.type--range { border: none; @@ -553,8 +580,8 @@ border: none; } - input[readonly] { - cursor: pointer; + input:read-only { + cursor: var(--goa-text-input-cursor-readonly, default); } input[type="number"] { @@ -581,7 +608,7 @@ .goa-input.input--disabled input:hover, .goa-input.input--disabled input:active, .goa-input.input--disabled input:focus { - color: var(--goa-color-text-secondary); + color: var(--goa-text-input-color-text-disabled); } .goa-input.input--disabled input:hover { @@ -604,12 +631,13 @@ display: flex; align-items: center; white-space: normal; - height: 42px; + height: var(--goa-text-input-height, 42px); } .leading-content .leading-content-slot :global(::slotted(div)), .trailing-content .trailing-content-slot :global(::slotted(div)) { padding: var(--goa-text-input-padding); + font: var(--goa-text-input-typography); } .prefix, @@ -628,6 +656,39 @@ border-bottom-right-radius: var(--goa-text-input-border-radius); } + /* V2: Read-only input field styling (exclude disabled inputs) */ + .container.v2 .goa-input:has(input:read-only:not(:disabled)) { + background-color: var(--goa-text-input-color-bg-readonly); + } + + /* V2: Read-only input field styling (exclude disabled inputs) */ + .container.v2.goa-input:not(.error)::has(input:read-only:not(:disabled):not(:focus-visible):not(:hover)) { + box-shadow: var(--goa-text-input-border-readonly); + } + + /* V2: Read-only leading/trailing content - background, border, and text color */ + .container.v2.leading-content:has(input:read-only:not(:disabled)) + .leading-content-slot + :global(::slotted(div)), + .container.v2.trailing-content:has(input:read-only:not(:disabled)) + .trailing-content-slot + :global(::slotted(div)) { + background-color: var(--goa-text-input-lt-content-color-bg-readonly); + box-shadow: var(--goa-text-input-border-readonly); + color: var(--goa-text-input-color-text); + } + + /* V2: Disabled leading/trailing content - text color and border (must come after all default slot styles) */ + .container.v2.leading-content:has(.input--disabled) + .leading-content-slot + :global(::slotted(div)), + .container.v2.trailing-content:has(.input--disabled) + .trailing-content-slot + :global(::slotted(div)) { + color: var(--goa-text-input-color-text-disabled); + box-shadow: var(--goa-text-input-border-disabled); + } + .goa-input:has(.prefix) .leading-icon, .leading-content .leading-icon { margin-right: calc(var(--goa-border-width-s) * -1); @@ -704,8 +765,9 @@ opacity: 1; } - /* TODO add styling for autofill - input:-webkit-autofill { - box-shadow: 0 0 0px 1000px #E0F0FC inset !important; - } */ + /* Autofill styling - override browser defaults */ + input:autofill { + background-color: var(--goa-text-input-color-bg) !important; + -webkit-text-fill-color: var(--goa-text-input-color-text) !important; + } diff --git a/libs/web-components/src/components/linear-progress/LinearProgress.spec.ts b/libs/web-components/src/components/linear-progress/LinearProgress.spec.ts new file mode 100644 index 0000000000..fe3cdb0c93 --- /dev/null +++ b/libs/web-components/src/components/linear-progress/LinearProgress.spec.ts @@ -0,0 +1,148 @@ +import { render, waitFor } from "@testing-library/svelte"; +import GoALinearProgress from "./LinearProgress.svelte"; +import { it, describe } from "vitest"; + +describe("GoALinearProgress", () => { + const testid = "progressbar"; + + [-1, 0, 20, 100, 101].forEach((progress: number) => { + it(`renders the linear progress with progress value ${progress}%`, async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress, + }); + + await waitFor(() => { + const expectedPercentage = Math.max(0, Math.min(progress || 0, 100)); + expect(queryByTestId(`${testid}-percentage`)?.innerHTML).toContain( + `${expectedPercentage}%`, + ); + expect( + queryByTestId(`${testid}-progressbar-container`)?.getAttribute( + "aria-valuenow", + ), + ).toBe(`${expectedPercentage}`); + }); + }); + }); + + it("renders the ARIA attributes correctly", async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress: 50, + ariaLabel: "Loading progress", + ariaLabelledby: "progress-label", + }); + + await waitFor(() => { + const progressBar = queryByTestId( + `${testid}-progressbar-container`, + ) as HTMLElement; + expect(progressBar.getAttribute("role")).toBe("progressbar"); + expect(progressBar.getAttribute("aria-label")).toBe("Loading progress"); + expect(progressBar.getAttribute("aria-labelledby")).toBe( + "progress-label", + ); + expect(progressBar.getAttribute("aria-valuemin")).toBe("0"); + expect(progressBar.getAttribute("aria-valuemax")).toBe("100"); + expect(progressBar.getAttribute("aria-valuenow")).toBe("50"); + expect(progressBar.getAttribute("aria-valuetext")).toBeNull(); + }); + }); + + it("rounds the percentage down when progress is a decimal", async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress: 50.6, + }); + + await waitFor(() => { + expect(queryByTestId(`${testid}-percentage`)?.innerHTML).toContain("51%"); + }); + }); + + it("rounds the percentage up when progress is a decimal", async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress: 50.4, + }); + + await waitFor(() => { + expect(queryByTestId(`${testid}-percentage`)?.innerHTML).toContain("50%"); + }); + }); + + it("shows the percentage when percentVisibility is not set", async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress: 50, + }); + + await waitFor(() => { + expect(queryByTestId(`${testid}-percentage`)).not.toBeNull(); + }); + }); + + it("shows the percentage when percentVisibility is true", async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress: 50, + percentVisibility: "visible", + }); + + await waitFor(() => { + expect(queryByTestId(`${testid}-percentage`)).not.toBeNull(); + }); + }); + + it("hides the percentage when percentVisibility is false", async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress: 50, + percentVisibility: "hidden", + }); + + await waitFor(() => { + expect(queryByTestId(`${testid}-percentage`)).toBeNull(); + }); + }); + + it("renders indeterminate progress when progress is not provided", async () => { + const { queryByTestId } = render(GoALinearProgress, { testid }); + + await waitFor(() => { + // Check the indeterminate indicator is visible and the determinate one is hidden + expect(queryByTestId(`${testid}-indeterminate-indicator`)).not.toBeNull(); + expect(queryByTestId(`${testid}-determinate-indicator`)).toBeNull(); + }); + }); + + // aria-valuenow should not be present when the value is indeterminate + it("does render aria-valuenow attribute when progress is indeterminate", async () => { + const { queryByTestId } = render(GoALinearProgress, { testid }); + + await waitFor(() => { + const progressBar = queryByTestId( + `${testid}-progressbar-container`, + ) as HTMLElement; + expect(progressBar.getAttribute("aria-valuenow")).toBeNull(); + expect(progressBar.getAttribute("aria-valuetext")).toBe("In progress"); + }); + }); + + // aria-valuetext should not be present when the value is indeterminate + it("does render aria-valuetext attribute when progress is indeterminate", async () => { + const { queryByTestId } = render(GoALinearProgress, { + testid, + progress: 100, + }); + + await waitFor(() => { + const progressBar = queryByTestId( + `${testid}-progressbar-container`, + ) as HTMLElement; + expect(progressBar.getAttribute("aria-valuetext")).toBeNull(); + expect(progressBar.getAttribute("aria-valuenow")).toBe("100"); + }); + }); +}); diff --git a/libs/web-components/src/components/linear-progress/LinearProgress.svelte b/libs/web-components/src/components/linear-progress/LinearProgress.svelte new file mode 100644 index 0000000000..4f7c95c09a --- /dev/null +++ b/libs/web-components/src/components/linear-progress/LinearProgress.svelte @@ -0,0 +1,123 @@ + + + + +
+
+ {#if !isDeterminate} + + {:else} + + {/if} +
+ {#if percentVisibility === "visible"} + {`${determinateValue}%`} + {/if} +
+ + diff --git a/libs/web-components/src/components/link/Link.svelte b/libs/web-components/src/components/link/Link.svelte index 8a5a61fa85..b2487ed4a2 100644 --- a/libs/web-components/src/components/link/Link.svelte +++ b/libs/web-components/src/components/link/Link.svelte @@ -15,7 +15,8 @@ export let leadingicon: GoAIconType | null = null; export let trailingicon: GoAIconType | null = null; - export let color: "interactive" | "light" = "interactive"; + export let color: "interactive" | "dark" | "light" = "interactive"; + export let size: "xsmall" | "small" | "medium" | "large" = "medium"; export let action: string = ""; export let actionArg: string = ""; @@ -30,6 +31,13 @@ let _rootEl: HTMLElement; + $: _iconSize = { + xsmall: "2xsmall", // 12px + small: "xsmall", // 16px + medium: "small", // 18px + large: "medium", // 20px + }[size]; + onMount(() => { if (action) { _rootEl.addEventListener("click", handleClick); @@ -45,21 +53,23 @@ diff --git a/libs/web-components/src/components/menu-button/MenuAction.spec.ts b/libs/web-components/src/components/menu-button/MenuAction.spec.ts index 855ceb551b..c5a7bb8e79 100644 --- a/libs/web-components/src/components/menu-button/MenuAction.spec.ts +++ b/libs/web-components/src/components/menu-button/MenuAction.spec.ts @@ -20,7 +20,7 @@ describe("GoAMenuAction", () => { it("should render with testid", async () => { const { findByTestId } = render(GoAMenuAction, { text: "Test Action", - testid: "menu-action-test" + testid: "menu-action-test", }); const button = await findByTestId("menu-action-test"); @@ -38,7 +38,7 @@ describe("GoAMenuAction", () => { it("should render with icon when provided", async () => { const { findByRole } = render(GoAMenuAction, { text: "Test Action", - icon: "add" + icon: "add", }); const button = await findByRole("button"); @@ -60,7 +60,7 @@ describe("GoAMenuAction", () => { it("should accept custom action", async () => { const { findByRole } = render(GoAMenuAction, { text: "Test Action", - action: "custom-action" + action: "custom-action", }); const button = await findByRole("button"); @@ -73,7 +73,7 @@ describe("GoAMenuAction", () => { const onClick = vi.fn(); const { findByRole } = render(GoAMenuAction, { text: "Test Action", - action: "test-action" + action: "test-action", }); const button = await findByRole("button"); @@ -82,14 +82,16 @@ describe("GoAMenuAction", () => { expect(onClick).toHaveBeenCalledTimes(1); expect(onClick.mock.calls[0][0].detail.action).toBe("click"); - expect(onClick.mock.calls[0][0].detail.data).toEqual({ action: "test-action" }); + expect(onClick.mock.calls[0][0].detail.data).toEqual({ + action: "test-action", + }); }); it("should dispatch bind event on mount", async () => { const onBind = vi.fn(); const { findByRole } = render(GoAMenuAction, { text: "Test Action", - action: "test-action" + action: "test-action", }); const button = await findByRole("button"); @@ -101,8 +103,8 @@ describe("GoAMenuAction", () => { }); // Find the bind event call - const bindCall = onBind.mock.calls.find(call => - call[0].detail.action === "bind" + const bindCall = onBind.mock.calls.find( + (call) => call[0].detail.action === "bind", ); expect(bindCall).toBeTruthy(); expect(bindCall[0].detail.data).toBe(button); @@ -110,34 +112,16 @@ describe("GoAMenuAction", () => { }); describe("styling", () => { - it("should have proper button structure", async () => { - const { findByRole } = render(GoAMenuAction, { text: "Test Action" }); - const button = await findByRole("button"); - - expect(button.tagName).toBe("BUTTON"); - - const span = button.querySelector("span"); - expect(span).toBeTruthy(); - expect(span).toHaveTextContent("Test Action"); - expect(span).toHaveStyle("padding-bottom: var(--font-valign-fix)"); - }); - it("should render icon before text when both provided", async () => { const { findByRole } = render(GoAMenuAction, { text: "Test Action", - icon: "add" + icon: "add", }); const button = await findByRole("button"); const icon = button.querySelector("goa-icon"); - const span = button.querySelector("span"); - expect(icon).toBeTruthy(); - expect(span).toBeTruthy(); - - // Icon should come before span in DOM order - const children = Array.from(button.children); - expect(children.indexOf(icon)).toBeLessThan(children.indexOf(span)); + expect(icon?.getAttribute("type")).toBe("add"); }); }); diff --git a/libs/web-components/src/components/menu-button/MenuAction.svelte b/libs/web-components/src/components/menu-button/MenuAction.svelte index 7f5939daaf..7fbfaf1c91 100644 --- a/libs/web-components/src/components/menu-button/MenuAction.svelte +++ b/libs/web-components/src/components/menu-button/MenuAction.svelte @@ -19,7 +19,7 @@ - diff --git a/libs/web-components/src/components/menu-button/MenuButton.spec.ts b/libs/web-components/src/components/menu-button/MenuButton.spec.ts index 933f64ffe2..6c990b585e 100644 --- a/libs/web-components/src/components/menu-button/MenuButton.spec.ts +++ b/libs/web-components/src/components/menu-button/MenuButton.spec.ts @@ -13,7 +13,7 @@ describe("GoAMenuButton", () => { it("should render with testid", async () => { const { container } = render(GoAMenuButton, { text: "Menu Button", - testid: "menu-button-test" + testid: "menu-button-test", }); expect(container.innerHTML).toContain('data-testid="menu-button-test"'); @@ -24,7 +24,7 @@ describe("GoAMenuButton", () => { it(`should render ${type} type`, async () => { const { container } = render(GoAMenuButton, { text: "Menu Button", - type: type as "primary" | "secondary" | "tertiary" + type: type as "primary" | "secondary" | "tertiary", }); expect(container.innerHTML).toContain(`type="${type}"`); @@ -88,4 +88,27 @@ describe("GoAMenuButton", () => { expect(container.innerHTML).toContain('slot="target"'); }); }); + + describe("leading icon", () => { + it("should render without leadingIcon by default", async () => { + const { container } = render(GoAMenuButton, { + text: "Menu Button", + }); + + const button = container.querySelector("goa-button"); + expect(button).toBeTruthy(); + expect(button?.getAttribute("leadingicon")).toBeNull(); + }); + + it("should render with leadingIcon when provided", async () => { + const { container } = render(GoAMenuButton, { + text: "Menu Button", + leadingIcon: "add", + }); + + const button = container.querySelector("goa-button"); + expect(button).toBeTruthy(); + expect(button?.getAttribute("leadingicon")).toBe("add"); + }); + }); }); diff --git a/libs/web-components/src/components/menu-button/MenuButton.svelte b/libs/web-components/src/components/menu-button/MenuButton.svelte index 4ac51e800b..b3ba1699c0 100644 --- a/libs/web-components/src/components/menu-button/MenuButton.svelte +++ b/libs/web-components/src/components/menu-button/MenuButton.svelte @@ -1,13 +1,17 @@ - @@ -371,6 +379,7 @@ bind:this={_rootEl} data-testid={testid} style={styles( + "display: inline-block", height === "full" && "height: 100%;", calculateMargin(mt, mr, mb, ml), style("--offset-top", voffset), @@ -395,16 +404,23 @@ -
+
@@ -427,7 +443,6 @@ display: inline; align-items: center; height: 100%; - position: relative; } .popover-target { @@ -455,7 +470,9 @@ border-radius: var(--goa-popover-border-radius); outline: none; overflow: visible; - filter: var(--goa-popover-shadow); + box-shadow: var(--goa-popover-box-shadow, none); + filter: var(--goa-popover-shadow, none); + border: var(--goa-popover-border, none); margin-top: var(--offset-top, 3px); margin-bottom: var(--offset-bottom, 3px); margin-left: var(--offset-left, 0); diff --git a/libs/web-components/src/components/radio-group/RadioGroup.svelte b/libs/web-components/src/components/radio-group/RadioGroup.svelte index 4b122c03d9..529d5ccb7d 100644 --- a/libs/web-components/src/components/radio-group/RadioGroup.svelte +++ b/libs/web-components/src/components/radio-group/RadioGroup.svelte @@ -25,14 +25,18 @@ FieldsetErrorRelayDetail, FieldsetResetFieldsMsg, } from "../../types/relay-types"; - // Validator + // Validators const [Orientations, validateOrientation] = typeValidator("Radio group orientation", [ "vertical", "horizontal", ]); + const [Version, validateVersion] = typeValidator("Version", ["1", "2"]); + const [Size, validateSize] = typeValidator("Size", ["default", "compact"]); - // Type + // Types type Orientation = (typeof Orientations)[number]; + type VersionType = (typeof Version)[number]; + type SizeType = (typeof Size)[number]; // Public @@ -41,6 +45,8 @@ export let orientation: Orientation = "vertical"; export let disabled: string = "false"; export let error: string = "false"; + export let version: VersionType = "1"; + export let size: SizeType = "default"; export let testid: string = ""; export let arialabel: string = ""; export let mt: Spacing = null; @@ -55,8 +61,11 @@ // Reactive $: isDisabled = toBoolean(disabled); + $: isCompact = size === "compact"; $: { isDisabled; + version; + isCompact; bindOptions(); } @@ -86,6 +95,8 @@ // Hooks onMount(() => { validateOrientation(orientation); + validateVersion(version); + validateSize(size); addRelayListener(); sendMountedMessage(); getChildren(); @@ -163,6 +174,8 @@ name, checked: props.value === value, revealAriaLabel: props.revealAriaLabel, + version: version, + compact: version === "2" && isCompact, }, }), ); @@ -212,6 +225,8 @@ bind:this={_rootEl} style={calculateMargin(mt, mr, mb, ml)} class={`goa-radio-group--${orientation}`} + class:v2={version === "2"} + class:compact={isCompact} data-testid={testid} role="radiogroup" aria-label={arialabel} @@ -233,6 +248,11 @@ gap: var(--goa-radio-group-gap-horizontal); } + /* V2 compact size variant - V2-only feature */ + .goa-radio-group--horizontal.v2.compact { + gap: var(--goa-radio-group-gap-horizontal-compact); + } + .goa-radio-group--vertical { display: flex; flex-direction: column; /* Vertical stacking */ @@ -240,6 +260,11 @@ width: 100%; } + /* V2 compact size variant - V2-only feature */ + .goa-radio-group--vertical.v2.compact { + gap: var(--goa-radio-group-gap-vertical-compact); + } + /* Focus styles */ .goa-radio-group--horizontal:focus, .goa-radio-group--vertical:focus { diff --git a/libs/web-components/src/components/radio-item/RadioItem.svelte b/libs/web-components/src/components/radio-item/RadioItem.svelte index a48bc88f2b..50280e60be 100644 --- a/libs/web-components/src/components/radio-item/RadioItem.svelte +++ b/libs/web-components/src/components/radio-item/RadioItem.svelte @@ -8,6 +8,7 @@ arialabel: { reflect: true }, error: { reflect: true }, revealarialabel: { reflect: true }, + disabled: { reflect: true }, }, }} /> @@ -22,6 +23,8 @@ error: boolean; name: string; checked: boolean; + version?: string; + compact?: boolean; ariaLabel: string; maxWidth: string; revealAriaLabel?: string; @@ -73,6 +76,8 @@ let _revealSlotEl: HTMLElement; let _formFields: HTMLElement[] = []; let _revealSlotHeight: number = 0; + let _version: string = "1"; + let _compact: boolean = false; // Reactive @@ -184,12 +189,15 @@ function addInitListener() { _radioItemEl.addEventListener("radio-group:init", (e: Event) => { const data = (e as CustomEvent).detail; - isDisabled = data.disabled; + // Item is disabled if EITHER the group is disabled OR the item itself is disabled + isDisabled = data.disabled || toBoolean(disabled); error = fromBoolean(data.error); checked = fromBoolean(data.checked); description = data.description; name = data.name; revealarialabel = data.revealAriaLabel; + _version = data.version || "1"; + _compact = data.compact || false; }); } @@ -246,6 +254,8 @@ class="radio" class:radio--disabled={isDisabled} class:radio--error={isError} + class:v2={_version === "2"} + class:compact={_compact} > .radio { display: inline-flex; + align-items: flex-start; + gap: var(--goa-radio-gap-label, var(--goa-space-xs)); + } + + /* V2 compact: Use smaller gap */ + .radio.v2.compact { + gap: var(--goa-space-xs); } label.radio { @@ -316,15 +333,30 @@ } .label { - padding: 0 var(--goa-space-xs); font: var(--goa-radio-label); + margin-top: -3px; /* V1: Optical centering - move text up */ + } + + /* V2: Adjust for different line-height */ + .radio.v2 .label { + margin-top: 1px; /* V2: Optical centering - slight downward adjustment */ + } + + /* Compact mode - V2 only */ + .radio.compact .label { + font: var(--goa-radio-label-compact); } .description { font: var(--goa-radio-description); margin-left: var(--goa-space-xl); margin-top: var(--goa-space-2xs); - color: var(--goa-color-text-default); + color: var(--goa-input-color-text-helper, var(--goa-color-text-default)); + } + + /* V2 default: Description aligns with label (icon width + gap) */ + .radio.v2:not(.compact) ~ .description { + margin-left: calc(var(--goa-radio-size) + var(--goa-radio-gap-label)); } .reveal { @@ -342,16 +374,38 @@ } .icon { + position: relative; display: inline-block; height: var(--goa-radio-size); width: var(--goa-radio-size); border-radius: var(--goa-radio-border-radius); background-color: var(--goa-radio-color-bg); - transition: box-shadow 100ms ease-in-out; - + transition: all 100ms ease-in-out; /* prevent squishing of radio button */ flex: 0 0 auto; - margin-top: var(--font-valign-fix); + } + + /* V2: Inner dot for checked state */ + .v2 .icon::after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: var(--goa-radio-inner-size); + height: var(--goa-radio-inner-size); + border-radius: 50%; + transition: background-color 100ms ease-in-out; + } + + .icon::before { + content: ''; + position: absolute; + width: 44px; + height: 44px; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); } .radio--disabled .label, @@ -364,74 +418,166 @@ /* States --------------------------------------------- */ - /* Unchecked */ + /* Unchecked - Default */ input[type="radio"]:not(:checked) ~ .icon { - border: var(--goa-border-width-s) solid var(--goa-color-greyscale-700); - margin-top: 3px; + border: var(--goa-radio-border); } - /* Unchecked:hover */ - input[type="radio"]:hover ~ .icon { + + /* Unchecked - Hover */ + input[type="radio"]:not(:checked):hover ~ .icon { border: var(--goa-radio-border-hover); } - /* Unchecked:focus */ - input[type="radio"]:focus-visible ~ .icon, - input[type="radio"]:hover:focus-visible ~ .icon { + + /* Unchecked - Focus */ + input[type="radio"]:not(:checked):focus-visible ~ .icon { outline: var(--goa-radio-border-focus); + outline-offset: 2px; } - /* Unchecked:hover+focus */ - input[type="radio"]:hover:focus-visible ~ .icon { + + /* Unchecked - Hover+Focus */ + input[type="radio"]:not(:checked):hover:focus-visible ~ .icon { border: var(--goa-radio-border); + outline: var(--goa-radio-border-focus); + outline-offset: 2px; + } + + /* Unchecked - Disabled */ + input[type="radio"]:not(:checked):disabled ~ .icon { + border: var(--goa-radio-border-disabled); + } + + /* V2: Unchecked - Disabled background */ + .radio.v2 input[type="radio"]:not(:checked):disabled ~ .icon { + background-color: var(--goa-radio-color-bg-disabled); } - /* Checked */ + /* Checked - Default */ input[type="radio"]:checked ~ .icon { border: var(--goa-radio-border-checked); - margin-top: 3px; } - /* Checked:hover */ + /* V2 only: Inner dot */ + .radio.v2 input[type="radio"]:checked ~ .icon::after { + background-color: var(--goa-radio-inner-color); + } + + /* Checked - Hover */ input[type="radio"]:checked:hover ~ .icon { border: var(--goa-radio-border-checked-hover); } - /* Checked:hover+focus */ + /* V2 only: Inner dot hover */ + .radio.v2 input[type="radio"]:checked:hover ~ .icon::after { + background-color: var(--goa-radio-inner-color-hover); + } + + /* Checked - Focus */ + input[type="radio"]:checked:focus-visible ~ .icon { + outline: var(--goa-radio-border-focus); + outline-offset: 2px; + } + + /* Checked - Hover+Focus */ input[type="radio"]:checked:hover:focus-visible ~ .icon { border: var(--goa-radio-border-checked); + outline: var(--goa-radio-border-focus); + outline-offset: 2px; } - /* Disabled */ - input[type="radio"]:disabled ~ .icon, - input[type="radio"]:disabled:focus-visible ~ .icon { - border: var(--goa-radio-border-disabled); - } - input[type="radio"]:disabled:checked ~ .icon, - input[type="radio"]:disabled:checked:focus-visible ~ .icon { + /* Checked - Disabled */ + input[type="radio"]:checked:disabled ~ .icon { border: var(--goa-radio-border-checked-disabled); } + /* V2 only: Inner dot disabled */ + .radio.v2 input[type="radio"]:checked:disabled ~ .icon::after { + background-color: var(--goa-radio-inner-color-disabled); + } + + /* V2: Checked - Disabled background */ + .radio.v2 input[type="radio"]:checked:disabled ~ .icon { + background-color: var(--goa-radio-color-bg-disabled); + } - /* Error */ - .radio--error input[type="radio"] ~ .icon { + /* Unchecked - Error */ + .radio--error input[type="radio"]:not(:checked) ~ .icon.icon { border: var(--goa-radio-border-error); } - .radio--error input[type="radio"]:hover ~ .icon { + + /* V2: Unchecked - Error background */ + .radio.v2.radio--error input[type="radio"]:not(:checked) ~ .icon { + background-color: var(--goa-radio-color-bg-error); + } + + /* Unchecked - Error+Hover */ + .radio--error input[type="radio"]:not(:checked):hover ~ .icon { border: var(--goa-radio-border-error-hover); } - .radio--error input[type="radio"]:hover:focus-visible ~ .icon { + + /* V2: Unchecked - Error+Hover background */ + .radio.v2.radio--error input[type="radio"]:not(:checked):hover ~ .icon { + background-color: var(--goa-radio-color-bg-error-hover); + } + + /* Unchecked - Error+Focus */ + .radio--error input[type="radio"]:not(:checked):focus-visible ~ .icon { outline: var(--goa-radio-border-focus); - border: var(--goa-radio-border-error); + outline-offset: 2px; + } + + /* Unchecked - Error+Disabled */ + .radio--error input[type="radio"]:not(:checked):disabled ~ .icon { + border: var(--goa-radio-border-error-disabled); + } + + /* V2: Unchecked - Error+Disabled background */ + .radio.v2.radio--error input[type="radio"]:not(:checked):disabled ~ .icon { + background-color: var(--goa-radio-color-bg-disabled); } - .radio--error input[type="radio"]:checked ~ .icon { + + /* Checked - Error */ + .radio--error input[type="radio"]:checked ~ .icon, + .radio--error.v2 input[type="radio"]:checked ~ .icon { border: var(--goa-radio-border-checked-error); } + /* V2 only: Inner dot error */ + .radio--error.v2 input[type="radio"]:checked ~ .icon::after { + background-color: var(--goa-radio-inner-color-error); + } + + /* V2: Checked - Error background */ + .radio.v2.radio--error input[type="radio"]:checked ~ .icon { + background-color: var(--goa-radio-color-bg-error); + } + + /* Checked - Error+Hover */ .radio--error input[type="radio"]:checked:hover ~ .icon { border: var(--goa-radio-border-checked-error-hover); } - .radio--error input[type="radio"]:checked:hover:focus-visible ~ .icon { - outline: var(--goa-radio-border-focus); - border: var(--goa-radio-border-checked-error); + /* V2 only: Inner dot error hover */ + .radio--error.v2 input[type="radio"]:checked:hover ~ .icon::after { + background-color: var(--goa-radio-inner-color-error-hover); } - .radio--error input[type="radio"]:disabled ~ .icon { - border: var(--goa-radio-border-error-disabled); + + /* V2: Checked - Error+Hover background */ + .radio.v2.radio--error input[type="radio"]:checked:hover ~ .icon { + background-color: var(--goa-radio-color-bg-error-hover); + } + + /* Checked - Error+Focus */ + .radio--error input[type="radio"]:checked:focus-visible ~ .icon { + outline: var(--goa-radio-border-focus); + outline-offset: 2px; } - .radio--error input[type="radio"]:disabled:checked ~ .icon { + + /* Checked - Error+Disabled */ + .radio--error input[type="radio"]:checked:disabled ~ .icon { border: var(--goa-radio-border-checked-error-disabled); } + /* V2 only: Inner dot error disabled */ + .radio--error.v2 input[type="radio"]:checked:disabled ~ .icon::after { + background-color: var(--goa-radio-inner-color-disabled); + } + + /* V2: Checked - Error+Disabled background */ + .radio.v2.radio--error input[type="radio"]:checked:disabled ~ .icon { + background-color: var(--goa-radio-color-bg-disabled); + } diff --git a/libs/web-components/src/components/side-menu-group/SideMenuGroup.svelte b/libs/web-components/src/components/side-menu-group/SideMenuGroup.svelte index 688ac945b3..a70b98b8bf 100644 --- a/libs/web-components/src/components/side-menu-group/SideMenuGroup.svelte +++ b/libs/web-components/src/components/side-menu-group/SideMenuGroup.svelte @@ -14,6 +14,7 @@ import type { GoAIconType } from "../icon/Icon.svelte"; import { calculateMargin, Spacing } from "../../common/styling"; + export let version: "1" | "2" = "1"; export let heading: string; export let icon: GoAIconType | null = null; export let testid: string = ""; @@ -121,6 +122,7 @@
{#if icon}
- + {#if version === "2"} + + {:else} + + {/if}
{/if} {heading}
- {#if _open} - + {#if version === "2"} + {#if _open} + + {:else} + + {/if} {:else} - + {#if _open} + + {:else} + + {/if} {/if}
-
@@ -153,9 +166,9 @@ :global(::slotted(goa-side-menu-heading)), :global(::slotted(a:visited)) { /* required to override base styles */ - color: var(--goa-side-menu-color-menu-item) !important; + color: var(--goa-side-menu-color-item, var(--goa-color-text-default)) !important; display: block; - font: var(--goa-side-menu-typography-item); + font: var(--goa-side-menu-group-item-typography, var(--goa-side-menu-typography-item)); margin-left: var(--goa-side-menu-child-margin); background-color: var(--goa-side-menu-group-color-bg); } @@ -168,11 +181,11 @@ } :global(::slotted(a.current)) { - font: var(--goa-side-menu-typography-item-current); + font: var(--goa-side-menu-group-item-typography-current, var(--goa-side-menu-typography-item-current)); border-left: var(--goa-side-menu-child-border-left-selected); background: var(--goa-side-menu-child-color-bg-selected); /* required to override base styles & above :global(::slotted(a) !important */ - color: var(--goa-side-menu-child-color-text-selected)!important; + color: var(--goa-side-menu-color-item-current, var(--goa-color-text-default))!important; } :global(::slotted(a:hover:not(.current))) { @@ -183,7 +196,7 @@ :global(::slotted(a:focus-visible)), .heading:focus-visible { outline: var(--goa-side-menu-item-focus-border); - outline-offset: -3px; + outline-offset: var(--goa-side-menu-item-focus-outline-offset, -3px); } @@ -191,11 +204,7 @@ gap: var(--goa-space-xs); /* 8px - the minimum space between the text and the chevron icon */ display: flex; flex-direction: row; - align-items: flex-start; - } - - goa-icon { - margin-top: var(--goa-space-2xs); /* vertically centering the icon with text */ + align-items: center; } /** @@ -204,17 +213,20 @@ */ :host([child="true"]) a.heading, .heading { - color: var(--goa-side-menu-color-menu-item); + color: var(--goa-side-menu-color-item, var(--goa-color-text-default)); display: flex; justify-content: space-between; font: var(--goa-side-menu-typography-item); padding: var(--goa-side-menu-parent-padding); text-decoration: none; - font: var(--goa-side-menu-typography-item); border-radius: var(--goa-side-menu-group-border-radius); } .heading.open { + font: var(--goa-side-menu-typography-item); + } + .heading.open.current { font: var(--goa-side-menu-typography-item-current); + color: var(--goa-side-menu-color-item-current, var(--goa-color-text-default)); } :host([child="true"]) a.heading { @@ -262,4 +274,72 @@ .leading-icon { height: var(--goa-icon-size-l); /* to make sure the icon vertical center */ } + + /* V2 Styles */ + + /* V2: Open group heading */ + .side-menu-group.v2 .heading.open { + border-radius: var(--goa-side-menu-group-border-radius-open, 0); + background: var(--goa-color-greyscale-100); + } + + /* V2: Nested child links - typography, padding, border-radius, colors */ + .side-menu-group.v2 :global(::slotted(a)) { + border-radius: var(--goa-border-radius-l, 6px); + font: var(--goa-side-menu-group-item-typography, var(--goa-side-menu-typography-item)); + padding: var(--goa-space-2xs) var(--goa-space-xs); + border-left: none; + margin-left: 0; + color: var(--goa-color-text-secondary) !important; + } + + /* V2: Group container - left border on container instead of individual items */ + .side-menu-group.v2 .group { + border-left: var(--goa-side-menu-child-border-width) solid var(--goa-color-greyscale-100); + margin-left: var(--goa-side-menu-group-container-margin-left, 20px); + padding-left: var(--goa-space-s); + margin-top: var(--goa-space-xs); + margin-bottom: var(--goa-side-menu-group-container-margin-bottom, 6px); + } + + /* V2: Current state - background, bold text, default text color */ + .side-menu-group.v2 :global(::slotted(a.current)) { + border-left: none; + background: var(--goa-side-menu-color-bg-menu-item-hover); + color: var(--goa-color-text-default) !important; + font-weight: var(--goa-font-weight-bold); + } + + /* V2: Hover state */ + .side-menu-group.v2 :global(::slotted(a:hover:not(.current))) { + border-left: none; + background: var(--goa-side-menu-color-bg-menu-item-hover); + } + + /* V2: Group heading - padding, alignment, color */ + .side-menu-group.v2 .heading { + padding: var(--goa-space-xs) var(--goa-space-s); + align-items: flex-start; + color: var(--goa-color-text-secondary); + } + + .side-menu-group.v2 .heading:hover { + border-radius: var(--goa-side-menu-group-border-radius-open, 0); + } + + .side-menu-group.v2 .heading:focus-visible { + border-radius: var(--goa-side-menu-group-border-radius-open, 0); + } + + /* V2: Nested groups (child attribute) */ + :host([child="true"]) .side-menu-group.v2 a.heading { + border-radius: var(--goa-side-menu-group-border-radius-open, 0); + } + + /* V2: Icon containers - smaller height for size-3 icons, align with first line */ + .side-menu-group.v2 .leading-icon, + .side-menu-group.v2 .trailing-icon { + height: var(--goa-icon-size-3, 1.25rem); + margin-top: 1px; + } diff --git a/libs/web-components/src/components/side-menu-heading/SideMenuHeading.svelte b/libs/web-components/src/components/side-menu-heading/SideMenuHeading.svelte index afdf129c8e..db85fa0adc 100644 --- a/libs/web-components/src/components/side-menu-heading/SideMenuHeading.svelte +++ b/libs/web-components/src/components/side-menu-heading/SideMenuHeading.svelte @@ -3,15 +3,20 @@ -

+

{#if icon} - + {#if version === "2"} + + {:else} + + {/if} {/if} - +

@@ -21,21 +26,45 @@ align-items: center; } + /* V2: Icon aligns with first line of text */ + h2.v2.icon { + align-items: flex-start; + } + goa-icon { color: var(--goa-side-menu-icon-color); - font-size: var(--goa-side-menu-icon-size); margin-right: var(--goa-side-menu-heading-icon-gap); -} + } + + /* V2: Remove margin-right from icon, match text color */ + h2.v2 goa-icon { + margin-right: 0; + color: var(--goa-side-menu-heading-color); + } h2 { border-top: var(--goa-side-menu-heading-border); background: var(--goa-side-menu-heading-color-bg); padding: var(--goa-side-menu-heading-padding); - color: var(--goa-side-menu-heading-color, #666); + color: var(--goa-side-menu-heading-color); font: var(--goa-side-menu-heading-typography); display: flex; align-items: flex-start; margin: var(--goa-side-menu-heading-margin); gap: var(--goa-side-menu-heading-gap); } + + /* V2 Styles */ + h2.v2 { + border-top: none; + border-bottom: var(--goa-side-menu-heading-border); + margin-bottom: var(--goa-space-2xs); + margin-right: var(--goa-space-xs); + padding: var(--goa-side-menu-heading-padding-top, 14px) var(--goa-space-s) var(--goa-space-xs) var(--goa-space-s); + } + + /* V2: Adjust label vertical alignment */ + h2.v2 .label { + margin-top: 2px; + } diff --git a/libs/web-components/src/components/side-menu/SideMenu.svelte b/libs/web-components/src/components/side-menu/SideMenu.svelte index 3d0b0b72a8..c3358eae90 100644 --- a/libs/web-components/src/components/side-menu/SideMenu.svelte +++ b/libs/web-components/src/components/side-menu/SideMenu.svelte @@ -6,6 +6,7 @@ import { isUrlMatch, getMatchedLink } from "../../common/urls"; import { SideMenuGroupProps } from "../side-menu-group/SideMenuGroup.svelte"; + export let version: "1" | "2" = "1"; export let testid: string = ""; let _rootEl: HTMLElement; @@ -101,7 +102,7 @@ } -
+
@@ -109,7 +110,7 @@ :global(::slotted(a)), :global(::slotted(a:visited)) { /* required to override base styles */ - color: var(--goa-side-menu-text-color, var(--goa-color-text-default)) !important; + color: var(--goa-side-menu-color-item, var(--goa-color-text-default)) !important; display: block; font: var(--goa-side-menu-typography-item); padding: var(--goa-side-menu-padding-item); @@ -118,6 +119,7 @@ :global(::slotted(a.current)) { font: var(--goa-side-menu-typography-item-current); + color: var(--goa-side-menu-color-item-current, var(--goa-color-text-default)) !important; background: var(--goa-side-menu-color-bg-menu-item-hover); } @@ -127,7 +129,7 @@ :global(::slotted(a:focus-visible)) { outline: var(--goa-side-menu-item-focus-border); - outline-offset: -3px; + outline-offset: var(--goa-side-menu-item-focus-outline-offset, -3px); } .side-menu { @@ -135,5 +137,21 @@ height: 100%; flex-direction: column; gap: var(--goa-side-menu-items-gap); + background-color: var(--goa-side-menu-color-bg); + border-right: var(--goa-side-menu-border-right); + } + + /* V2 Styles */ + .side-menu.v2 { + padding: var(--goa-side-menu-padding); + } + + .side-menu.v2 :global(::slotted(a)) { + border-radius: var(--goa-side-menu-item-border-radius, 0); + padding: var(--goa-space-xs) var(--goa-space-s); + display: flex; + align-items: flex-start; + gap: var(--goa-space-xs); + color: var(--goa-color-text-secondary) !important; } diff --git a/libs/web-components/src/components/tab/Tab.svelte b/libs/web-components/src/components/tab/Tab.svelte index 7806cc1cb3..9370d02ac6 100644 --- a/libs/web-components/src/components/tab/Tab.svelte +++ b/libs/web-components/src/components/tab/Tab.svelte @@ -11,6 +11,7 @@ headingType: "slot" | "string"; heading: HTMLSlotElement | string; open: boolean; + disabled: boolean; } @@ -24,6 +25,7 @@ export let heading: string = ""; export let open: boolean = false; + export let disabled: boolean = false; // ======= // Private @@ -57,7 +59,8 @@ el: _rootEl, headingType, heading: headingType === "string" ? heading : getHeadingContents(), - open: open + open: open, + disabled: disabled } })) }, 1); diff --git a/libs/web-components/src/components/table/Table.svelte b/libs/web-components/src/components/table/Table.svelte index 879a8517dd..f20de3ce54 100644 --- a/libs/web-components/src/components/table/Table.svelte +++ b/libs/web-components/src/components/table/Table.svelte @@ -1,7 +1,9 @@ @@ -20,11 +22,16 @@ ); type Variant = (typeof Variants)[number]; + const [Version, validateVersion] = typeValidator("Version", ["1", "2"]); + type VersionType = (typeof Version)[number]; + // Public export let width: string = ""; export let stickyheader: string = "false"; + export let striped: string = "false"; export let variant: Variant = "normal"; + export let version: VersionType = "1"; export let testid: string = ""; export let mt: Spacing = null; @@ -40,11 +47,13 @@ // Reactive $: _stickyHeader = toBoolean(stickyheader); + $: _striped = toBoolean(striped); // Hooks onMount(() => { validateVariant(variant); + validateVersion(version); // without setTimeout it won't properly sort in Safari setTimeout(attachSortEventHandling, 0); @@ -122,7 +131,9 @@
diff --git a/libs/web-components/src/components/table/TableSortHeader.svelte b/libs/web-components/src/components/table/TableSortHeader.svelte index 85291a2e11..e8d5decc0a 100644 --- a/libs/web-components/src/components/table/TableSortHeader.svelte +++ b/libs/web-components/src/components/table/TableSortHeader.svelte @@ -14,10 +14,8 @@ if (_rootEl) { // Add styling if an ancestor has a class to style number columns, const hostEl = _rootEl.getRootNode().host; - const parentThead = hostEl?.closest("th"); - parentThead?.style.setProperty("--goa-table-header-padding", "0"); - const ancestor = hostEl?.closest("th.goa-table-number-header"); + const ancestor = hostEl?.closest("th.goa-table-number-header, th.goa-table-cell--numeric"); if (ancestor) { _rootEl.style.setProperty("--header-text-align", "flex-end"); _rootEl.style.setProperty("--header-align", "right"); @@ -57,18 +55,27 @@ line-height: inherit; height: inherit; width: 100%; - padding: var(--goa-space-s) var(--goa-space-m) var(--goa-space-xs); + padding: var(--goa-table-padding-heading, var(--goa-space-s) var(--goa-space-m) var(--goa-space-xs)); justify-content: var(--header-text-align, flex-start); - gap: var(--goa-space-2xs); + gap: var(--goa-table-sort-header-gap, var(--goa-space-2xs)); align-items: flex-end; text-align: var(--header-align, left); } /* User set classes */ button:hover { - background-color: var(--goa-color-greyscale-100); + background-color: var(--goa-table-color-bg-heading-hover, var(--goa-color-greyscale-100)); cursor: pointer; - color: var(--goa-color-interactive-hover); + color: var(--goa-table-color-heading-hover, var(--goa-color-interactive-hover)); + } + + button:focus { + outline: none; + } + + button:focus-visible { + box-shadow: 0 0 0 var(--goa-border-width-l) + var(--goa-color-interactive-focus); } button goa-icon { diff --git a/libs/web-components/src/components/tabs/Tabs.svelte b/libs/web-components/src/components/tabs/Tabs.svelte index 7095ef0a5d..49173383fd 100644 --- a/libs/web-components/src/components/tabs/Tabs.svelte +++ b/libs/web-components/src/components/tabs/Tabs.svelte @@ -7,9 +7,10 @@ export let initialtab: number = -1; // 1-based export let testid: string = ""; + export let version: "1" | "2" = "1"; + export let variant: "default" | "segmented" = "default"; - // Private - + // Private let _rootEl: HTMLElement; let _tabsEl: HTMLElement; let _slotEl: HTMLElement; @@ -18,6 +19,16 @@ let _bindTimeoutId: any; let _initialLoad: boolean = true; + let _segmentedIndicatorLeft: number = 0; + let _segmentedIndicatorWidth: number = 0; + let _segmentedIndicatorHeight: number = 30; // 30px is a default height, real value will be calculated later + let _segmentedTransitionDuration: number = 0; + let _previousTabIndex: number = 1; + + const MIN_TRANSITION_DURATION = 200; + const DURATION_PER_PIXEL = 0.2; + const MAX_TRANSITION_DURATION = 400; + // ======== // Hooks // ======== @@ -38,6 +49,40 @@ // Functions // ========= + function getFirstEnabledTab(): number { + for (let i = 0; i < _tabProps.length; i++) { + if (!_tabProps[i].disabled) { + return i + 1; + } + } + return 1; + } + + function isTabDisabled(tabIndex: number): boolean { + const index = tabIndex - 1; + return index >= 0 && index < _tabProps.length && _tabProps[index].disabled; + } + + function findNextEnabledTab( + currentIndex: number, + direction: "left" | "right", + ): number { + const totalTabs = _tabProps.length; + let nextIndex = currentIndex; + + for (let i = 0; i < totalTabs; i++) { + nextIndex += direction === "right" ? 1 : -1; + + if (nextIndex > totalTabs) nextIndex = 1; + if (nextIndex < 1) nextIndex = totalTabs; + + if (!isTabDisabled(nextIndex)) { + return nextIndex; + } + } + return currentIndex; + } + function getTabIndexFromHash() { // We need to see the full hash in order to open the correct tab and scroll down to the anchor if there is const fullHash = window.location.href.split("#").slice(1).join("#"); // Ex: tab-1#example1 @@ -80,7 +125,13 @@ // It will help prevent scrolling to tabs if it is located in the bottom of the page if (tabIndexFromHash == null && initialtab === -1) return; - setCurrentTab(tabIndexFromHash ?? (initialtab || 1)); + let targetTab = tabIndexFromHash ?? (initialtab || 1); + + if (isTabDisabled(targetTab)) { + targetTab = getFirstEnabledTab(); + } + + setCurrentTab(targetTab); _initialLoad = false; } }, 1); @@ -132,12 +183,37 @@ link.setAttribute("data-testid", `tab-${index + 1}`); link.setAttribute("role", "tab"); link.setAttribute("href", `${path}${search}#${tabSlug}`); - link.addEventListener("click", () => setCurrentTab(index + 1)); link.setAttribute("aria-controls", `tabpanel-${index + 1}`); + + // Store text content for CSS pseudo-element (prevents layout shift when font-weight changes) + if (variant === "segmented") { + const textContent = headingEl.textContent?.trim() || ""; + if (textContent) { + link.setAttribute("data-text", textContent); + } + } + + if (tabProps.disabled) { + link.setAttribute("aria-disabled", "true"); + link.addEventListener("click", (e) => { + e.preventDefault(); + e.stopPropagation(); + }); + } else { + link.addEventListener("click", () => setCurrentTab(index + 1)); + } + link.appendChild(headingEl); _tabsEl?.appendChild(link); }); + + if (variant === "segmented") { + // wait for DOM to finish render before calculating position + requestAnimationFrame(() => { + updateSegmentedIndicatorPosition({ withAnimation: false }); + }); + } } function addKeyboardEventListeners() { @@ -151,7 +227,9 @@ function handleHashChange() { const tabIndexFromHash = getTabIndexFromHash(); if (tabIndexFromHash !== null && tabIndexFromHash !== _currentTab) { - setCurrentTab(tabIndexFromHash); + if (!isTabDisabled(tabIndexFromHash)) { + setCurrentTab(tabIndexFromHash); + } } } @@ -163,6 +241,41 @@ window.removeEventListener("hashchange", handleHashChange); } + /** + * Updates the segmented indicator position with velocity-based animation. + * @param withAnimation - Whether to animate the transition (false on first load, true on tab change) + */ + function updateSegmentedIndicatorPosition({ withAnimation }: { withAnimation: boolean }) { + if (!_tabsEl || variant !== "segmented") return; + + const tabs = _tabsEl.querySelectorAll('[role="tab"]'); + const selectedTab = tabs[_currentTab - 1] as HTMLElement; + + if (!selectedTab) return; + + const tabsRect = _tabsEl.getBoundingClientRect(); + const selectedRect = selectedTab.getBoundingClientRect(); + + if (withAnimation) { + const previousTab = tabs[_previousTabIndex - 1] as HTMLElement; + if (previousTab) { + const tabDistance = Math.abs(selectedRect.left - previousTab.getBoundingClientRect().left); + const calculatedDuration = MIN_TRANSITION_DURATION + DURATION_PER_PIXEL * tabDistance; + _segmentedTransitionDuration = Math.min(calculatedDuration, MAX_TRANSITION_DURATION) / 1000; + } else { + _segmentedTransitionDuration = 0; + } + } else { + _segmentedTransitionDuration = 0; + } + + _segmentedIndicatorLeft = selectedRect.left - tabsRect.left - 1; + _segmentedIndicatorWidth = selectedRect.width; + _segmentedIndicatorHeight = selectedRect.height; + + _previousTabIndex = _currentTab; + } + function setCurrentTab(tab: number) { if (!_tabsEl) return; @@ -229,6 +342,10 @@ } } } + + if (variant === "segmented") { + updateSegmentedIndicatorPosition({ withAnimation: true }); + } } function handleKeydownEvents() { @@ -246,28 +363,26 @@ switch (e.key) { case "ArrowUp": case "ArrowLeft": - if (_currentTab === 1) { - setCurrentTab(_tabProps.length); - } else { - setCurrentTab(_currentTab - 1); - } + setCurrentTab(findNextEnabledTab(_currentTab, "left")); isHandled = true; break; case "ArrowDown": case "ArrowRight": - if (_currentTab === _tabProps.length) { - setCurrentTab(1); - } else { - setCurrentTab(_currentTab + 1); - } + setCurrentTab(findNextEnabledTab(_currentTab, "right")); isHandled = true; break; case "Home": - setCurrentTab(1); + setCurrentTab(getFirstEnabledTab()); isHandled = true; break; case "End": - setCurrentTab(_tabProps.length); + // Find last enabled tab + for (let i = _tabProps.length; i >= 1; i--) { + if (!isTabDisabled(i)) { + setCurrentTab(i); + break; + } + } isHandled = true; break; default: @@ -283,8 +398,22 @@ -
-
+
+
+ {#if variant === "segmented" && _segmentedIndicatorWidth > 0} +
+ {/if} +
@@ -303,6 +432,10 @@ gap: var(--goa-space-xs); } + /* ======================================== + Base Styles (Token-driven, works for V1 and V2) + ======================================== */ + :global([role="tab"]) { display: flex; background: none; @@ -311,32 +444,38 @@ cursor: pointer; border: none; font: var(--goa-tab-typography); - color: var(--goa-tab-text-color); + color: var(--goa-tab-color-text-not-selected, var(--goa-tab-text-color)); text-decoration: none; } :global([role="tab"][aria-selected="true"]) { font: var(--goa-tab-typography-selected); + color: var(--goa-tab-color-text-selected, var(--goa-tab-text-color)); } :global([role="tab"]:focus-visible) { outline: var(--goa-tab-border-focus); } - :global([role="tab"]:hover:not([aria-selected="true"])) { - border-bottom: var(--goa-tab-border-hover); + :global( + [role="tab"]:hover:not([aria-selected="true"]):not([aria-disabled="true"]) + ) { + color: var(--goa-tab-color-text-hover, var(--goa-tab-text-color)); + } + + /* Disabled tab styles */ + :global([role="tab"][aria-disabled="true"]) { + color: var(--goa-color-greyscale-400, #949494); + cursor: not-allowed; + pointer-events: none; } :global([role="tabpanel"]:focus-visible) { outline: var(--goa-tab-border-focus); - outline-offset: 4px; /* Adjust as needed */ + outline-offset: 4px; } - @media (--not-mobile) { - :global([role="tablist"]) { - - } .tabs { border-bottom: var(--goa-tabs-bottom-border); display: flex; @@ -348,40 +487,253 @@ border-bottom: var(--goa-tab-border-not-selected); text-overflow: ellipsis; min-width: var(--goa-space-2xl); - justify-content: center; /* Horizontally center content */ + justify-content: center; } :global([role="tab"][aria-selected="true"]) { border-bottom: var(--goa-tab-border-selected); } + :global( + [role="tab"]:hover:not([aria-selected="true"]):not([aria-disabled="true"]) + ) { + border-bottom: var(--goa-tab-border-hover); + } + + :global([role="tab"][aria-disabled="true"]) { + border-bottom: var(--goa-tab-border-not-selected); + } } @media (--mobile) { - .tabs { border-left: var(--goa-tabs-bottom-border); border-bottom: var(--goa-tabs-bottom-border); display: flex; flex-direction: column; gap: var(--goa-tabs-gap-small-screen); - padding-bottom: var(--goa-space-m); - margin-bottom: 2rem; + padding-bottom: var(--goa-tabs-padding-bottom-small-screen, var(--goa-space-m)); } - :global([role="tab"]) { padding: var(--goa-tab-padding-mobile); border-left: var(--goa-tab-border-not-selected); text-overflow: wrap; - white-space: normal; /* Allows text to wrap */ - word-break: break-word; /* Ensures long words break onto the next line */ - overflow-wrap: break-word; /* Alternative for word wrapping */ + white-space: normal; + word-break: break-word; + overflow-wrap: break-word; } :global([role="tab"][aria-selected="true"]) { border-left: var(--goa-tab-border-selected); background: var(--goa-tab-color-bg-selected-small-screen); } - :global([role="tab"]:hover:not([aria-selected="true"])) { - border-left: var(--goa-tab-border-hover); - border-bottom: none; + :global( + [role="tab"]:hover:not([aria-selected="true"]):not([aria-disabled="true"]) + ) { + border-left: var(--goa-tab-border-hover); + background: var(--goa-tab-color-bg-hover-small-screen, transparent); + } + + :global([role="tab"][aria-disabled="true"]) { + border-left: var(--goa-tab-border-not-selected); + } + } + + .v2 :global([role="tab"]) { + position: relative; /* Required for ::after positioning */ + } + + .v2 :global([role="tab"]:focus-visible) { + border-radius: var(--goa-border-radius-xs); + } + + .v2 + :global( + [role="tab"]:hover:not([aria-selected="true"]):not([aria-disabled="true"]) + ) { + border-bottom: none; /* Remove V1 border on hover */ + } + + @media (--not-mobile) { + .v2 :global([role="tab"]) { + border-bottom: none; /* Remove V1 border, replaced with ::after */ + } + + /* V2 uses ::after pseudo-element for rounded corner indicators */ + .v2 :global([role="tab"]::after) { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: var(--goa-tab-indicator-width, 3px); + background: transparent; + border-radius: var(--goa-tab-indicator-border-radius-desktop, 6px 6px 0 0); + } + .v2 :global([role="tab"][aria-selected="true"]::after) { + background: var(--goa-tab-indicator-color-active, #0070C4); + } + .v2 + :global( + [role="tab"]:hover:not([aria-selected="true"]):not( + [aria-disabled="true"] + )::after + ) { + background: var(--goa-tab-indicator-color-hover, #dcdcdc); + } + } + + @media (--mobile) { + .v2 :global([role="tab"]) { + border-left: none; /* Remove V1 border, replaced with ::after */ + } + + /* V2 uses ::after pseudo-element for rounded corner indicators */ + .v2 :global([role="tab"]::after) { + content: ""; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: var(--goa-tab-indicator-width, 3px); + background: transparent; + border-radius: var(--goa-tab-indicator-border-radius-small-screen, 0 6px 6px 0); + } + .v2 :global([role="tab"][aria-selected="true"]::after) { + background: var(--goa-tab-indicator-color-active, #0070C4); + } + .v2 + :global( + [role="tab"]:hover:not([aria-selected="true"]):not( + [aria-disabled="true"] + )::after + ) { + background: var(--goa-tab-indicator-color-hover, #dcdcdc); + } + } + + /* ======================================== + Segmented Variant (Pill/Button style tabs) + ======================================== */ + + /* Container - gray background with rounded corners */ + .segmented .tabs { + position: relative; + background: var(--goa-color-greyscale-50, #f8f8f8); + border: 1px solid var(--goa-color-greyscale-150, #dcdcdc); + border-bottom: 1px solid var(--goa-color-greyscale-150, #dcdcdc); /* Override base border-bottom */ + border-radius: var(--goa-border-radius-m, 10px); + padding: 3px; + gap: var(--goa-space-3xs); + margin-bottom: var(--goa-tabs-margin-bottom, 2rem); + flex-direction: row; + flex-wrap: nowrap; + width: fit-content; + } + + /* Animated background indicator for selected tab */ + .segmented .segmented-indicator { + position: absolute; + top: 3px; + left: var(--segmented-indicator-left, 0); + width: var(--segmented-indicator-width, 0); + height: var(--segmented-indicator-height, 30px); + background: var(--goa-color-greyscale-white, #ffffff); + border: var(--goa-border-width-s) solid var(--goa-color-greyscale-150, #dcdcdc); + border-radius: var(--goa-border-radius-xl); + pointer-events: none; + z-index: 0; + box-sizing: border-box; + + transition: + left var(--segmented-transition-duration, 0s) ease-out, + width var(--segmented-transition-duration, 0s) ease-out; + } + + /* Individual tabs - segmented style */ + .segmented :global([role="tab"]) { + position: relative; + z-index: 1; + background: transparent; + /* Override base border-bottom and border-left (mobile) */ + border: var(--goa-border-width-s) solid transparent; + border-radius: var(--goa-border-radius-xl); + min-height: 30px; + padding: 0 var(--goa-space-s, 12px); + /* Typography */ + font: var(--goa-typography-body-s); + color: var(--goa-color-greyscale-600, #666666); + /* Ensure proper alignment */ + display: flex; + align-items: center; + justify-content: center; + white-space: normal; + text-align: center; + min-width: auto; + /* Smooth transition for color changes */ + transition: color 0.15s ease; + } + + /* Hide the ::after indicator for segmented variant */ + .segmented :global([role="tab"]::after) { + display: none; + } + + /* Prevent layout shift when font-weight changes */ + .segmented :global([role="tab"][data-text]) { + flex-direction: column; + } + + .segmented :global([role="tab"][data-text]::before) { + content: attr(data-text); + font: var(--goa-typography-body-s); + font-weight: 600; + height: 0; + visibility: hidden; + overflow: hidden; + } + + .segmented :global([role="tab"][aria-selected="true"]) { + background: transparent; + border: var(--goa-border-width-s) solid transparent; + color: var(--goa-color-text-secondary, #666666); + font: var(--goa-typography-body-s); + font-weight: 600; + } + + .segmented + :global( + [role="tab"]:hover:not([aria-selected="true"]):not([aria-disabled="true"]) + ) { + background: var(--goa-color-greyscale-150, #dcdcdc); + border: var(--goa-border-width-s) solid transparent; + color: var(--goa-color-text-default, #353535); + } + + .segmented :global([role="tab"][aria-disabled="true"]) { + color: var(--goa-color-greyscale-400, #949494); + cursor: not-allowed; + pointer-events: none; + background: transparent; + } + + .segmented :global([role="tab"]:focus-visible) { + outline: var(--goa-border-width-l, 3px) solid + var(--goa-color-interactive-focus); + outline-offset: 1px; + border-radius: var(--goa-border-radius-s, 8px); + } + + /* Mobile - segmented tabs stay horizontal */ + @media (--mobile) { + .segmented .tabs { + flex-direction: row; + padding-bottom: var(--goa-space-2xs, 4px); + } + + .segmented :global([role="tab"]) { + border-left: none; + } + + .segmented :global([role="tab"][aria-selected="true"]) { + border-left: none; } } diff --git a/libs/web-components/src/components/temporary-notification/TemporaryNotification.svelte b/libs/web-components/src/components/temporary-notification/TemporaryNotification.svelte index 1f1b3615ce..93027b3867 100644 --- a/libs/web-components/src/components/temporary-notification/TemporaryNotification.svelte +++ b/libs/web-components/src/components/temporary-notification/TemporaryNotification.svelte @@ -32,6 +32,9 @@ export let actionText: string = ""; export let visible: boolean = true; export let animationDirection: TemporaryNotificationAnimationDirection = "down"; + + // Icon size for success/failure icons + const iconSize = "large";
- {#if type === "success"} - - {/if} +
+ {#if type === "success"} + + {/if} - {#if type === "failure"} - - {/if} + {#if type === "failure"} + + {/if} - - {message} - + + {message} + +
{#if actionText}
@@ -82,18 +87,35 @@ flex-direction: row; flex-wrap: wrap; align-items: center; - border-radius: var(--goa-border-radius-m); - gap: var(--goa-space-m); - padding: var(--goa-space-m) var(--goa-space-l); - max-width: 640px; - color: var(--goa-color-text-light); - transition: transform 0.3s ease, opacity 0.3s ease; + border-radius: var(--goa-temporary-notification-borderRadius, var(--goa-border-radius-m)); + gap: var(--goa-temporary-notification-row-gap, var(--goa-space-m)); /* 16px between content and action */ + padding: var(--goa-temporary-notification-padding, var(--goa-space-m) var(--goa-space-l)); + max-width: var(--goa-temporary-notification-max-width, 640px); + color: var(--goa-temporary-notification-color-text, var(--goa-color-text-light)); + transition: + transform var(--goa-temporary-notification-transition-duration, 0.3s) ease, + opacity var(--goa-temporary-notification-transition-duration, 0.3s) ease; overflow: hidden; } + /* Add extra bottom padding when progress bar is present */ + .snackbar.progress, + .snackbar.indeterminate { + padding: var(--goa-temporary-notification-padding-with-progress, var(--goa-space-m) var(--goa-space-l) 22px var(--goa-space-l)); + } + + /* Content wrapper keeps icon and message together as a single flex item */ + .content { + display: flex; + align-items: flex-start; /* Icon aligns with first line of text */ + gap: var(--goa-temporary-notification-column-gap, var(--goa-space-s)); + flex: 1 1 auto; + min-width: 0; /* Allow content to shrink */ + } + @media (--not-mobile) { .snackbar { - min-width: 360px; + min-width: var(--goa-temporary-notification-min-width-desktop, 360px); } } @@ -107,8 +129,8 @@ .snackbar.basic, .snackbar.indeterminate, .snackbar.progress { - border: 1px solid var(--goa-color-greyscale-700); - background: var(--goa-color-greyscale-black); + border: var(--goa-temporary-notification-borderWidth, var(--goa-border-width-s)) solid var(--goa-temporary-notification-color-border, var(--goa-color-greyscale-700)); + background: var(--goa-temporary-notification-color-bg-basic, var(--goa-color-greyscale-black)); } .action { @@ -123,7 +145,24 @@ bottom: 0; left: 0; width: 100%; - height: 6px; + height: var(--goa-temporary-notification-progress-bar-height, 6px); + border-radius: 0 0 var(--goa-temporary-notification-progress-bar-borderRadius, 0) var(--goa-temporary-notification-progress-bar-borderRadius, 0); + } + + /* Progress bar browser-specific styling */ + progress::-webkit-progress-bar { + background-color: var(--goa-temporary-notification-progress-bar-color-bg, #adadad); + border-radius: 0 0 var(--goa-temporary-notification-progress-bar-borderRadius, 0) var(--goa-temporary-notification-progress-bar-borderRadius, 0); + } + + progress::-webkit-progress-value { + background-color: var(--goa-temporary-notification-progress-bar-color-fill, white); + border-radius: 0 0 var(--goa-temporary-notification-progress-bar-borderRadius, 0) var(--goa-temporary-notification-progress-bar-borderRadius, 0); + } + + progress::-moz-progress-bar { + background-color: var(--goa-temporary-notification-progress-bar-color-fill, white); + border-radius: 0 0 var(--goa-temporary-notification-progress-bar-borderRadius, 0) var(--goa-temporary-notification-progress-bar-borderRadius, 0); } .show { @@ -143,23 +182,28 @@ } .hide.animate-up { - transform: translateY(-100px); + transform: translateY(calc(-1 * var(--goa-temporary-notification-animation-distance, 100px))); } .hide.animate-down { - transform: translateY(100px); + transform: translateY(var(--goa-temporary-notification-animation-distance, 100px)); } .snackbar.success { - background: var(--goa-color-success-default); + background: var(--goa-temporary-notification-color-bg-success, var(--goa-color-success-default)); } .snackbar.failure { - background: var(--goa-color-emergency-default); + background: var(--goa-temporary-notification-color-bg-failure, var(--goa-color-emergency-default)); } .message { flex: 1 1 auto; - font: var(--goa-typography-body-m); + font: var(--goa-temporary-notification-typography, var(--goa-typography-body-m)); + } + + /* Add top margin to message when icon is present to vertically center first line with icon */ + .content:has(goa-icon) .message { + margin-top: var(--goa-temporary-notification-padding-text-top, var(--goa-space-2xs)); } diff --git a/libs/web-components/src/components/text-area/TextArea.spec.ts b/libs/web-components/src/components/text-area/TextArea.spec.ts index 5d7341666f..e3be25728f 100644 --- a/libs/web-components/src/components/text-area/TextArea.spec.ts +++ b/libs/web-components/src/components/text-area/TextArea.spec.ts @@ -26,8 +26,8 @@ describe("GoATextArea", () => { expect(el).toHaveAttribute("autocomplete", "off"); }); - it("handles the change event", async () => { - const onChange = vi.fn(); + it("handles the input event", async () => { + const onInput = vi.fn(); const result = render(GoATextArea, { name: "name", testid: "test-id", @@ -37,19 +37,19 @@ describe("GoATextArea", () => { el.addEventListener("_change", (e: CustomEvent) => { expect(e.detail.name).toBe("name"); expect(e.detail.value).toBe("b"); - onChange(); + onInput(); }); - await fireEvent.change(el, { target: { value: "b" } }); + await fireEvent.input(el, { target: { value: "b" } }); await waitFor(() => { - expect(onChange).toBeCalledTimes(1); + expect(onInput).toBeCalledTimes(1); }); }); it("handles the keypress event", async () => { const onKeyPress = vi.fn(); - const onChange = vi.fn(); + const onInput = vi.fn(); const result = render(GoATextArea, { name: "name", value: "foo", @@ -59,22 +59,23 @@ describe("GoATextArea", () => { const textarea = result.queryByTestId("keypress"); textarea.addEventListener("_keyPress", (e: CustomEvent) => { expect(e.detail.name).toBe("name"); - expect(e.detail.value).toBe("foo"); + expect(e.detail.value).toBe("fooo"); expect(e.detail.key).toBe("o"); onKeyPress(); }); textarea.addEventListener("_change", (e: CustomEvent) => { expect(e.detail.name).toBe("name"); - expect(e.detail.value).toBe("foo"); - onChange(); + expect(e.detail.value).toBe("fooo"); + onInput(); }); - await fireEvent.keyUp(textarea, { target: { value: "foo" }, key: "o" }); + await fireEvent.input(textarea, { target: { value: "fooo" } }); + await fireEvent.keyUp(textarea, { target: { value: "fooo" }, key: "o" }); await waitFor(() => { expect(onKeyPress).toBeCalledTimes(1); - expect(onChange).toBeCalledTimes(1); + expect(onInput).toBeCalledTimes(1); }); }); diff --git a/libs/web-components/src/components/text-area/TextArea.svelte b/libs/web-components/src/components/text-area/TextArea.svelte index 98004e796d..8cc282ba6e 100644 --- a/libs/web-components/src/components/text-area/TextArea.svelte +++ b/libs/web-components/src/components/text-area/TextArea.svelte @@ -8,6 +8,7 @@ receive, relay, toBoolean, + typeValidator, } from "../../common/utils"; import { calculateMargin, @@ -41,6 +42,16 @@ export let maxcount: number = -1; export let autocomplete: string = ""; + // version + type VersionType = "1" | "2"; + const [Version, validateVersion] = typeValidator("Version", ["1", "2"]); + export let version: VersionType = "1"; + + // size + type SizeType = "default" | "compact"; + const [Size, validateSize] = typeValidator("Size", ["default", "compact"]); + export let size: SizeType = "default"; + // margin export let mt: Spacing = null; export let mr: Spacing = null; @@ -79,6 +90,8 @@ // Hooks onMount(() => { + validateVersion(version); + validateSize(size); addRelayListener(); sendMountedMessage(); const finalWidth = width.includes("%") ? width : `min(${width}, 100%)`; @@ -130,7 +143,7 @@ ); } - function onChange(e: Event) { + function onInput(_e: Event) { if (isDisabled) return; dispatchChange(_textareaEl.value); } @@ -138,7 +151,6 @@ function onKeyPress(e: KeyboardEvent) { if (isDisabled) return; dispatchKeyPress(e); - dispatchChange(_textareaEl.value); } function dispatchChange(value: string) { @@ -175,6 +187,9 @@ class="root" class:error={_error || (maxcount > 0 && count > maxcount)} class:disabled={isDisabled} + class:readonly={isReadonly} + class:compact={size === "compact"} + class:v2={version === "2"} style={` ${calculateMargin(mt, mr, mb, ml)}; --width: ${width}; @@ -194,8 +209,8 @@ data-testid={testid} {autocomplete} bind:value + on:input={onInput} on:keyup={onKeyPress} - on:change={onChange} on:focus={onFocus} on:blur={onBlur} /> @@ -276,6 +291,31 @@ color: var(--goa-text-area-color-text-disabled); } + /* Read-only state */ + .readonly, + .readonly:hover { + background-color: var( + --goa-text-area-color-bg-readonly, + var(--goa-color-greyscale-100) + ); + } + + /* V2 focus state - single blue border only (no layered borders) */ + .v2.root:focus-within { + box-shadow: var(--goa-text-area-border-focus); + } + .v2.error:focus, + .v2.error:focus-within, + .v2.error:focus-within:hover { + box-shadow: var(--goa-text-area-border-focus); + } + + /* V2 compact size variant */ + .v2.compact textarea { + padding: var(--goa-text-area-padding-compact); + font: var(--goa-text-area-typography-compact); + } + textarea[readonly] { cursor: pointer; } @@ -346,4 +386,4 @@ width: 100%; } } - \ No newline at end of file + diff --git a/libs/web-components/src/components/text/Text.svelte b/libs/web-components/src/components/text/Text.svelte index 2200b3738a..6b51299936 100644 --- a/libs/web-components/src/components/text/Text.svelte +++ b/libs/web-components/src/components/text/Text.svelte @@ -1,4 +1,11 @@ - + + + +
+ + diff --git a/libs/web-components/src/components/work-side-menu/WorkSideMenuItem.spec.ts b/libs/web-components/src/components/work-side-menu/WorkSideMenuItem.spec.ts new file mode 100644 index 0000000000..4b8460c6fb --- /dev/null +++ b/libs/web-components/src/components/work-side-menu/WorkSideMenuItem.spec.ts @@ -0,0 +1,22 @@ +import { it, expect } from "vitest"; +import { render } from "@testing-library/svelte"; +import GoAWorkSideMenuItem from "./WorkSideMenuItem.svelte"; + +describe("WorkSideMenuItem", () => { + it("renders", async () => { + const { container } = render(GoAWorkSideMenuItem, { + label: "Foo", + url: "#", + badge: "42", + icon: "star", + testid: "foo", + type: "success", + }); + const link = container.querySelector(".menu-item"); + const badge = container.querySelector(".badge"); + + expect(container).toBeTruthy(); + expect(link).toBeTruthy(); + expect(badge).toBeTruthy(); + }); +}); diff --git a/libs/web-components/src/components/work-side-menu/WorkSideMenuItem.svelte b/libs/web-components/src/components/work-side-menu/WorkSideMenuItem.svelte new file mode 100644 index 0000000000..627a29ad3b --- /dev/null +++ b/libs/web-components/src/components/work-side-menu/WorkSideMenuItem.svelte @@ -0,0 +1,295 @@ + + + + + + + diff --git a/libs/web-components/src/index.ts b/libs/web-components/src/index.ts index 150701b70b..57dd7c5619 100644 --- a/libs/web-components/src/index.ts +++ b/libs/web-components/src/index.ts @@ -19,6 +19,7 @@ export * from "./components/checkbox-list/CheckboxList.svelte"; export * from "./components/chip/Chip.svelte"; export * from "./components/circular-progress/CircularProgress.svelte"; export * from "./components/container/Container.svelte"; +export * from "./components/data-grid/DataGrid.svelte"; export * from "./components/date-picker/DatePicker.svelte"; export * from "./components/details/Details.svelte"; export * from "./components/divider/Divider.svelte"; @@ -49,6 +50,7 @@ export * from "./components/hero-banner/HeroBanner.svelte"; export * from "./components/icon-button/IconButton.svelte"; export * from "./components/icon/Icon.svelte"; export * from "./components/input/Input.svelte"; +export * from "./components/linear-progress/LinearProgress.svelte"; export * from "./components/link/Link.svelte"; export * from "./components/link-button/LinkButton.svelte"; export * from "./components/menu-button/MenuAction.svelte"; @@ -84,3 +86,5 @@ export * from "./layouts/two-column-layout/TwoColumnLayout.svelte"; export * from "./components/table/Table.svelte"; export * from "./experimental/ExperimentalFormStepper.svelte"; export * from "./experimental/ExperimentalFormStep.svelte"; +export * from "./components/work-side-menu/WorkSideMenu.svelte"; +export * from "./components/work-side-menu/WorkSideMenuItem.svelte"; \ No newline at end of file diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000000..8a8cfe560c --- /dev/null +++ b/mise.toml @@ -0,0 +1,2 @@ +[tools] +node = "24.11.0" diff --git a/nx.json b/nx.json index a3d969e9f1..08a63ea723 100644 --- a/nx.json +++ b/nx.json @@ -6,10 +6,6 @@ "dependsOn": ["^build"], "inputs": ["production", "^production"] }, - "@nx/vite:test": { - "cache": true, - "inputs": ["default", "^production"] - }, "@nx/eslint:lint": { "cache": true, "inputs": [ @@ -33,6 +29,10 @@ "cache": true, "dependsOn": ["^build"], "inputs": ["production", "^production"] + }, + "@nx/vitest:test": { + "cache": true, + "inputs": ["default", "^production"] } }, "namedInputs": { diff --git a/package-lock.json b/package-lock.json index 20ff1ccc96..5785104029 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "Apache-2.0", "dependencies": { "@angular/animations": "20.1.6", - "@angular/common": "20.1.6", - "@angular/compiler": "20.1.6", - "@angular/core": "20.1.6", + "@angular/common": "20.3.14", + "@angular/compiler": "^20.3.16", + "@angular/core": "^20.3.16", "@angular/forms": "20.1.6", "@angular/platform-browser": "20.1.6", "@angular/platform-browser-dynamic": "20.1.6", @@ -22,35 +22,38 @@ "date-fns": "^3.0.6", "react": "19.0.0", "react-dom": "19.0.0", - "react-router-dom": "6.11.2", + "react-router-dom": "^6.30.3", "rxjs": "~7.8.0", + "style-dictionary": "^5.1.1", + "svelte-routing": "^2.13.0", "tslib": "^2.3.0", "zone.js": "0.15.1" }, "devDependencies": { - "@abgov/design-tokens": "^1.6.0", + "@abgov/design-tokens": "^1.8.0", "@abgov/nx-release": "^10.0.0", - "@angular-devkit/build-angular": "20.1.5", + "@angular-devkit/build-angular": "^20.3.10", "@angular-devkit/core": "20.1.5", "@angular-devkit/schematics": "20.1.5", "@angular-eslint/eslint-plugin": "18.0.1", "@angular-eslint/eslint-plugin-template": "18.0.1", "@angular-eslint/template-parser": "18.0.1", - "@angular/cli": "~20.1.5", + "@angular/cli": "^20.3.13", "@angular/compiler-cli": "20.1.6", "@angular/language-service": "20.1.6", "@babel/core": "^7.14.5", "@babel/preset-react": "^7.14.5", "@faker-js/faker": "^8.3.1", - "@nx/angular": "21.5.2", - "@nx/eslint": "21.1.2", - "@nx/eslint-plugin": "21.1.2", - "@nx/jest": "21.1.2", - "@nx/js": "21.1.2", - "@nx/react": "21.5.2", - "@nx/vite": "21.1.2", - "@nx/web": "21.1.2", - "@nx/workspace": "21.1.2", + "@nx/angular": "22.3.3", + "@nx/eslint": "22.3.3", + "@nx/eslint-plugin": "22.3.3", + "@nx/jest": "22.3.3", + "@nx/js": "22.3.3", + "@nx/react": "22.3.3", + "@nx/vite": "22.3.3", + "@nx/vitest": "22.3.3", + "@nx/web": "22.3.3", + "@nx/workspace": "22.3.3", "@schematics/angular": "20.1.5", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@swc-node/register": "1.9.2", @@ -62,17 +65,18 @@ "@testing-library/svelte": "^4.0.5", "@testing-library/user-event": "^14.5.2", "@types/jest": "29.5.14", - "@types/node": "^18.16.9", + "@types/node": "^20.0.0", "@types/react": "19.0.0", "@types/react-dom": "19.0.0", - "@typescript-eslint/eslint-plugin": "7.18.0", - "@typescript-eslint/parser": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@typescript-eslint/utils": "^7.18.0", "@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react-swc": "^3.5.0", - "@vitest/browser": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", - "@vitest/ui": "^3.2.4", + "@vitest/browser": "^4.0.13", + "@vitest/browser-playwright": "^4.0.13", + "@vitest/coverage-v8": "4.0.9", + "@vitest/ui": "4.0.9", "autoprefixer": "^10.4.16", "eslint": "8.57.1", "eslint-config-prettier": "10.1.5", @@ -80,7 +84,7 @@ "eslint-plugin-jsx-a11y": "6.10.1", "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "5.0.0", - "glob": "^10.3.10", + "glob": "^12.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-preset-angular": "^14.2.4", @@ -88,7 +92,7 @@ "jsdom": "^26.1.0", "jsonc-eslint-parser": "^2.1.0", "ng-packagr": "20.1.0", - "nx": "21.1.2", + "nx": "22.3.3", "playwright": "^1.50.1", "postcss": "^8.4.5", "postcss-import": "~14.1.0", @@ -98,27 +102,25 @@ "prettier": "^3.2.0", "prettier-plugin-svelte": "^3.1.2", "rollup": "^4.9.6", + "semantic-release": "^25.0.2", "svelte": "^4.2.19", "svelte-check": "^3.6.2", "swc-loader": "0.1.15", - "ts-jest": "^29.1.0", + "ts-jest": "29.4.6", "ts-node": "10.9.1", "typescript": "5.8.3", "vite": "~5.4.20", "vite-plugin-dts": "4.5.4", - "vitest": "^3.2.4", + "vitest": "4.0.9", "vitest-browser-react": "^1.0.0", "vitest-dom": "^0.1.1" } }, "node_modules/@abgov/design-tokens": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@abgov/design-tokens/-/design-tokens-1.7.0.tgz", - "integrity": "sha512-g2KvEOKJkpETvxmjInS7XKAa9DvO8YMm2NXaBvhwfwdSynfFj1riD9WDzfQp+MHFq4dxXnWUtFAK71aG4Id1Yw==", - "dev": true, - "dependencies": { - "style-dictionary": "^3.7.1" - } + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@abgov/design-tokens/-/design-tokens-1.8.0.tgz", + "integrity": "sha512-TA5R33YiycWYqUe3+GdJndcuJx92VuzWwZsX8OD40kRUiBRgpoIrPf7fn6bCiJaRuUglSHTCtL9Z2Fvov5Beag==", + "dev": true }, "node_modules/@abgov/nx-release": { "version": "10.0.0", @@ -138,6 +140,58 @@ "tslib": "^2.0.0" } }, + "node_modules/@actions/core": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.2.tgz", + "integrity": "sha512-Ast1V7yHbGAhplAsuVlnb/5J8Mtr/Zl6byPPL+Qjq3lmfIgWF1ak1iYfF/079cRERiuTALTXkSuEUdZeDCfGtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@actions/exec": "^2.0.0", + "@actions/http-client": "^3.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-2.0.0.tgz", + "integrity": "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@actions/io": "^2.0.0" + } + }, + "node_modules/@actions/http-client": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.1.tgz", + "integrity": "sha512-SbGS8c/vySbNO3kjFgSW77n83C4MQx/Yoe+b1hAdpuvfHxnkHzDq2pWljUpAA56Si1Gae/7zjeZsV0CYjmLo/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.28.5" + } + }, + "node_modules/@actions/http-client/node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@actions/io": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-2.0.0.tgz", + "integrity": "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==", + "dev": true, + "license": "MIT" + }, "node_modules/@adobe/css-tools": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", @@ -145,42 +199,58 @@ "dev": true, "license": "MIT" }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/client-abtesting": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.32.0.tgz", - "integrity": "sha512-HG/6Eib6DnJYm/B2ijWFXr4txca/YOuA4K7AsEU0JBrOZSB+RU7oeDyNBPi3c0v0UDDqlkBqM3vBU/auwZlglA==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.32.0.tgz", - "integrity": "sha512-8Y9MLU72WFQOW3HArYv16+Wvm6eGmsqbxxM1qxtm0hvSASJbxCm+zQAZe5stqysTlcWo4BJ82KEH1PfgHbJAmQ==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.32.0.tgz", - "integrity": "sha512-w8L+rgyXMCPBKmEdOT+RfgMrF0mT6HK60vPYWLz8DBs/P7yFdGo7urn99XCJvVLMSKXrIbZ2FMZ/i50nZTXnuQ==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", "dev": true, "license": "MIT", "engines": { @@ -188,151 +258,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.32.0.tgz", - "integrity": "sha512-AdWfynhUeX7jz/LTiFU3wwzJembTbdLkQIOLs4n7PyBuxZ3jz4azV1CWbIP8AjUOFmul6uXbmYza+KqyS5CzOA==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.32.0.tgz", - "integrity": "sha512-bTupJY4xzGZYI4cEQcPlSjjIEzMvv80h7zXGrXY1Y0KC/n/SLiMv84v7Uy+B6AG1Kiy9FQm2ADChBLo1uEhGtQ==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.32.0.tgz", - "integrity": "sha512-if+YTJw1G3nDKL2omSBjQltCHUQzbaHADkcPQrGFnIGhVyHU3Dzq4g46uEv8mrL5sxL8FjiS9LvekeUlL2NRqw==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.32.0.tgz", - "integrity": "sha512-kmK5nVkKb4DSUgwbveMKe4X3xHdMsPsOVJeEzBvFJ+oS7CkBPmpfHAEq+CcmiPJs20YMv6yVtUT9yPWL5WgAhg==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.32.0.tgz", - "integrity": "sha512-PZTqjJbx+fmPuT2ud1n4vYDSF1yrT//vOGI9HNYKNA0PM0xGUBWigf5gRivHsXa3oBnUlTyHV9j7Kqx5BHbVHQ==", + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.32.0.tgz", - "integrity": "sha512-kYYoOGjvNQAmHDS1v5sBj+0uEL9RzYqH/TAdq8wmcV+/22weKt/fjh+6LfiqkS1SCZFYYrwGnirrUhUM36lBIQ==", + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.32.0.tgz", - "integrity": "sha512-jyIBLdskjPAL7T1g57UMfUNx+PzvYbxKslwRUKBrBA6sNEsYCFdxJAtZSLUMmw6MC98RDt4ksmEl5zVMT5bsuw==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.32.0.tgz", - "integrity": "sha512-eDp14z92Gt6JlFgiexImcWWH+Lk07s/FtxcoDaGrE4UVBgpwqOO6AfQM6dXh1pvHxlDFbMJihHc/vj3gBhPjqQ==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0" + "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.32.0.tgz", - "integrity": "sha512-rnWVglh/K75hnaLbwSc2t7gCkbq1ldbPgeIKDUiEJxZ4mlguFgcltWjzpDQ/t1LQgxk9HdIFcQfM17Hid3aQ6Q==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0" + "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.32.0.tgz", - "integrity": "sha512-LbzQ04+VLkzXY4LuOzgyjqEv/46Gwrk55PldaglMJ4i4eDXSRXGKkwJpXFwsoU+c1HMQlHIyjJBhrfsfdyRmyQ==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0" + "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" @@ -353,13 +423,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2001.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.5.tgz", - "integrity": "sha512-LdjmE75wjmpHNfFsDecZB95H/DekX1hJLmRzGWid+Fd6lbyFBQyUjq+ucwD9WlHqqrD+CgKapQKnUhlBSIJxPQ==", + "version": "0.2003.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.10.tgz", + "integrity": "sha512-2SWetxJzS8gRX6OKQstkWx37VRvZVgcEBDLsDSaeTjpnwh81A+niZQjAVRdwL0NEt1Wixk/RxfeUuCmdyyHvhQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.5", + "@angular-devkit/core": "20.3.10", "rxjs": "7.8.2" }, "engines": { @@ -368,55 +438,93 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "20.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.10.tgz", + "integrity": "sha512-COOT2eVebDwHhwENk12VR6m0wjL8D7p0dncEHF15zaBt1IXEnVhGESjSrs5klnPnt5T55qCBKyCTaeK7i/cS8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/architect/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/@angular-devkit/build-angular": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.1.5.tgz", - "integrity": "sha512-WB2I1snyJBKvk1oeE8q02I7qSCtUdRh/WoLKip8BGefy5+wPqZsgb1BfbHL/u5GrwMstZVzMLKzGc3TcsfRwXw==", + "version": "20.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.10.tgz", + "integrity": "sha512-SWGh1ASXEXtzFv/OSlmYGsYlIWHNeZRWkwkBe6mPfxZMX4JZ4HKbxmMtKV9hifvFdITU393IxPH5JXlFZJpZhQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.5", - "@angular-devkit/build-webpack": "0.2001.5", - "@angular-devkit/core": "20.1.5", - "@angular/build": "20.1.5", - "@babel/core": "7.27.7", - "@babel/generator": "7.27.5", + "@angular-devkit/architect": "0.2003.10", + "@angular-devkit/build-webpack": "0.2003.10", + "@angular-devkit/core": "20.3.10", + "@angular/build": "20.3.10", + "@babel/core": "7.28.3", + "@babel/generator": "7.28.3", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.27.1", + "@babel/plugin-transform-async-generator-functions": "7.28.0", "@babel/plugin-transform-async-to-generator": "7.27.1", - "@babel/plugin-transform-runtime": "7.27.4", - "@babel/preset-env": "7.27.2", - "@babel/runtime": "7.27.6", + "@babel/plugin-transform-runtime": "7.28.3", + "@babel/preset-env": "7.28.3", + "@babel/runtime": "7.28.3", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "20.1.5", + "@ngtools/webpack": "20.3.10", "ansi-colors": "4.1.3", "autoprefixer": "10.4.21", "babel-loader": "10.0.0", "browserslist": "^4.21.5", - "copy-webpack-plugin": "13.0.0", + "copy-webpack-plugin": "13.0.1", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.5", + "esbuild-wasm": "0.25.9", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.3.0", + "less": "4.4.0", "less-loader": "12.3.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", - "mini-css-extract-plugin": "2.9.2", - "open": "10.1.2", + "mini-css-extract-plugin": "2.9.4", + "open": "10.2.0", "ora": "8.2.0", - "picomatch": "4.0.2", - "piscina": "5.1.2", + "picomatch": "4.0.3", + "piscina": "5.1.3", "postcss": "8.5.6", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", - "sass": "1.89.2", + "sass": "1.90.0", "sass-loader": "16.0.5", "semver": "7.7.2", "source-map-loader": "5.0.0", @@ -424,7 +532,7 @@ "terser": "5.43.1", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.99.9", + "webpack": "5.101.2", "webpack-dev-middleware": "7.4.2", "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", @@ -436,7 +544,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.5" + "esbuild": "0.25.9" }, "peerDependencies": { "@angular/compiler-cli": "^20.0.0", @@ -445,16 +553,16 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.1.5", + "@angular/ssr": "^20.3.10", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", + "jest": "^29.5.0 || ^30.2.0", + "jest-environment-jsdom": "^29.5.0 || ^30.2.0", "karma": "^6.3.0", "ng-packagr": "^20.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.8 <5.9" + "typescript": ">=5.8 <6.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -501,38 +609,343 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "20.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.10.tgz", + "integrity": "sha512-COOT2eVebDwHhwENk12VR6m0wjL8D7p0dncEHF15zaBt1IXEnVhGESjSrs5klnPnt5T55qCBKyCTaeK7i/cS8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.2003.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.10.tgz", + "integrity": "sha512-/e76O5MnoAplV+LW6XAWyd8e1KR1HqRTCSTngLMO+VMADbcQkD4i01ouridlxVLKkGDg83hvASUz2M6x0duZ9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2003.10", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@angular-devkit/core": { + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", + "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.2", + "source-map": "0.7.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-devkit/schematics": { "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.5.tgz", - "integrity": "sha512-Uh0VX9HQMLt4054P03f7UL6tu5kvuJhf5UXiRUzkaK/tMk7SDokp9YtN7lErPiWvDQFtuX9o27PMFpxwEfdRcA==", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.5.tgz", + "integrity": "sha512-fAxBFNIlete9FiqaqpQuXgjpoXwQRwKjv9MEW7DuciPYd/FFWr0858U2bzuJEk0mFNY3f9Q4vlY/RgDk9HWF2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.1.5", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.0.1.tgz", + "integrity": "sha512-lr4Ysoo28FBOKcJFQUGTMpbWDcak+gyuYvyggp37ERvazE6EDomPFxzEHNqVT9EI9sZ+GDBOoPR+EdFh0ALGNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.0.1.tgz", + "integrity": "sha512-pS3SYLa9DA+ENklGxEUlcw6/xCxgDk9fgjyaheuSjDxL3TIh1pTa4V2TptODdcPh7XCYXiVmy+e/w79mXlGzOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.0.1", + "@angular-eslint/utils": "18.0.1" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0-alpha.20", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.0.1.tgz", + "integrity": "sha512-u/eov/CFBb8l35D8dW78Dx5fBLd8FZFibKN9XQknhzXnDMpISuUOMny5g5/wvYYjqLgqEySXMiHKEAxEup7xtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.0.1", + "@angular-eslint/utils": "18.0.1", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0-alpha.20", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.0.1.tgz", + "integrity": "sha512-22fKzkWo9Ts8aY/WHL1A6seS2tpltgRRXVfnZnnqvQRyRiuPnx1FC0ly7+QPZkThh8vdLwxU+BvtLq9Uiqh9OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.0.1", + "eslint-scope": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.0.1.tgz", + "integrity": "sha512-Q9lCySqg+9h2cz08+SoWj48cY1i04tL1k3bsQJmF2TsylAw2mSsNGX2X3h9WkdxY7sUoY0mP7MVW1iU54Gobcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.0.1" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0-alpha.20", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/animations": { + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.1.6.tgz", + "integrity": "sha512-vSU0BP0BzX20HoCE81MKcr9cd6H9zB1qbCNk2J1ulH1C9rXs5ZpeORy+riIJTOZDYLtE0jCsXT3pvVb+nPmADQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.1.6", + "@angular/core": "20.1.6" + } + }, + "node_modules/@angular/build": { + "version": "20.3.10", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.10.tgz", + "integrity": "sha512-nQrj1nMNZygYDilThc7hPrD6/NIWF/BOSgMfE4VkXQp8d0QronP3HFJ/h77MeoughMRFRhix0pqQSlXJQ2SGTQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.5", - "@babel/core": "7.27.7", + "@angular-devkit/architect": "0.2003.10", + "@babel/core": "7.28.3", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.13", + "@inquirer/confirm": "5.1.14", "@vitejs/plugin-basic-ssl": "2.1.0", - "beasties": "0.3.4", + "beasties": "0.3.5", "browserslist": "^4.23.0", - "esbuild": "0.25.5", + "esbuild": "0.25.9", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", - "listr2": "8.3.3", + "listr2": "9.0.1", "magic-string": "0.30.17", "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.1.0", - "picomatch": "4.0.2", - "piscina": "5.1.2", - "rollup": "4.44.1", - "sass": "1.89.2", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rollup": "4.52.3", + "sass": "1.90.0", "semver": "7.7.2", "source-map-support": "0.5.21", "tinyglobby": "0.2.14", - "vite": "7.0.6", + "vite": "7.1.11", "watchpack": "2.4.4" }, "engines": { @@ -541,7 +954,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.4.1" + "lmdb": "3.4.2" }, "peerDependencies": { "@angular/compiler": "^20.0.0", @@ -551,14 +964,14 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.1.5", + "@angular/ssr": "^20.3.10", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^20.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.8 <5.9", + "typescript": ">=5.8 <6.0", "vitest": "^3.1.1" }, "peerDependenciesMeta": { @@ -600,124 +1013,23 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", - "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", - "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.40.0", - "tinyglobby": "^0.2.14" - }, - "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-devkit/build-angular/node_modules/@angular/build/node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", + "node_modules/@angular/build/node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", + "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -732,7 +1044,7 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -742,32 +1054,10 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@inquirer/confirm": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.13.tgz", - "integrity": "sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "node_modules/@angular/build/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", + "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", "cpu": [ "arm" ], @@ -778,10 +1068,10 @@ "android" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "node_modules/@angular/build/node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", + "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", "cpu": [ "arm64" ], @@ -792,10 +1082,10 @@ "android" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", + "node_modules/@angular/build/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", + "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", "cpu": [ "arm64" ], @@ -806,10 +1096,10 @@ "darwin" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", + "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", "cpu": [ "x64" ], @@ -820,10 +1110,10 @@ "darwin" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", - "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", + "node_modules/@angular/build/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", + "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", "cpu": [ "arm64" ], @@ -834,10 +1124,10 @@ "freebsd" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", - "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", + "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", "cpu": [ "x64" ], @@ -848,10 +1138,10 @@ "freebsd" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", + "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", "cpu": [ "arm" ], @@ -862,10 +1152,10 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", + "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", "cpu": [ "arm" ], @@ -876,10 +1166,10 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", + "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", "cpu": [ "arm64" ], @@ -890,10 +1180,10 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", + "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", "cpu": [ "arm64" ], @@ -904,12 +1194,12 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", + "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", "cpu": [ - "riscv64" + "loong64" ], "dev": true, "license": "MIT", @@ -918,12 +1208,12 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", - "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", + "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", "cpu": [ - "riscv64" + "ppc64" ], "dev": true, "license": "MIT", @@ -932,12 +1222,12 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", + "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", "cpu": [ - "s390x" + "riscv64" ], "dev": true, "license": "MIT", @@ -946,12 +1236,12 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", + "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "license": "MIT", @@ -960,12 +1250,12 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", + "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", "cpu": [ - "x64" + "s390x" ], "dev": true, "license": "MIT", @@ -974,125 +1264,115 @@ "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", + "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", + "node_modules/@angular/build/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", + "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", "cpu": [ - "ia32" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "node_modules/@angular/build/node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", + "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "openharmony" ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", - "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", + "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/@angular/build/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", + "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/@angular/build/node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", + "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/@angular/build/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", + "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/@angular/build/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/@angular-devkit/build-angular/node_modules/rollup": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", + "node_modules/@angular/build/node_modules/rollup": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", + "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", "dev": true, "license": "MIT", "dependencies": { @@ -1106,283 +1386,148 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.1", - "@rollup/rollup-android-arm64": "4.44.1", - "@rollup/rollup-darwin-arm64": "4.44.1", - "@rollup/rollup-darwin-x64": "4.44.1", - "@rollup/rollup-freebsd-arm64": "4.44.1", - "@rollup/rollup-freebsd-x64": "4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "4.44.1", - "@rollup/rollup-linux-arm64-gnu": "4.44.1", - "@rollup/rollup-linux-arm64-musl": "4.44.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-musl": "4.44.1", - "@rollup/rollup-linux-s390x-gnu": "4.44.1", - "@rollup/rollup-linux-x64-gnu": "4.44.1", - "@rollup/rollup-linux-x64-musl": "4.44.1", - "@rollup/rollup-win32-arm64-msvc": "4.44.1", - "@rollup/rollup-win32-ia32-msvc": "4.44.1", - "@rollup/rollup-win32-x64-msvc": "4.44.1", + "@rollup/rollup-android-arm-eabi": "4.52.3", + "@rollup/rollup-android-arm64": "4.52.3", + "@rollup/rollup-darwin-arm64": "4.52.3", + "@rollup/rollup-darwin-x64": "4.52.3", + "@rollup/rollup-freebsd-arm64": "4.52.3", + "@rollup/rollup-freebsd-x64": "4.52.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", + "@rollup/rollup-linux-arm-musleabihf": "4.52.3", + "@rollup/rollup-linux-arm64-gnu": "4.52.3", + "@rollup/rollup-linux-arm64-musl": "4.52.3", + "@rollup/rollup-linux-loong64-gnu": "4.52.3", + "@rollup/rollup-linux-ppc64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-musl": "4.52.3", + "@rollup/rollup-linux-s390x-gnu": "4.52.3", + "@rollup/rollup-linux-x64-gnu": "4.52.3", + "@rollup/rollup-linux-x64-musl": "4.52.3", + "@rollup/rollup-openharmony-arm64": "4.52.3", + "@rollup/rollup-win32-arm64-msvc": "4.52.3", + "@rollup/rollup-win32-ia32-msvc": "4.52.3", + "@rollup/rollup-win32-x64-gnu": "4.52.3", + "@rollup/rollup-win32-x64-msvc": "4.52.3", "fsevents": "~2.3.2" } }, - "node_modules/@angular-devkit/build-angular/node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "node_modules/@angular/build/node_modules/vite": { + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { - "webpack": "bin/webpack.js" + "vite": "bin/vite.js" }, "engines": { - "node": ">=10.13.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.2001.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2001.5.tgz", - "integrity": "sha512-AsycqeZz+DUYtqOwkmf0/Ucsrc/sVuoZVSAl+qZDSj1Qd3ou73Z+QioRIwu2MRRRgLMSBFZymaf0csoaW/ddmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.2001.5", - "rxjs": "7.8.2" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" - } - }, - "node_modules/@angular-devkit/core": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", - "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.2", - "source-map": "0.7.4" + "url": "https://github.com/vitejs/vite?sponsor=1" }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "chokidar": "^4.0.0" + "@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": { - "chokidar": { + "@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-devkit/schematics": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.5.tgz", - "integrity": "sha512-fAxBFNIlete9FiqaqpQuXgjpoXwQRwKjv9MEW7DuciPYd/FFWr0858U2bzuJEk0mFNY3f9Q4vlY/RgDk9HWF2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.5", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.0", - "rxjs": "7.8.2" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.0.1.tgz", - "integrity": "sha512-lr4Ysoo28FBOKcJFQUGTMpbWDcak+gyuYvyggp37ERvazE6EDomPFxzEHNqVT9EI9sZ+GDBOoPR+EdFh0ALGNw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-eslint/eslint-plugin": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.0.1.tgz", - "integrity": "sha512-pS3SYLa9DA+ENklGxEUlcw6/xCxgDk9fgjyaheuSjDxL3TIh1pTa4V2TptODdcPh7XCYXiVmy+e/w79mXlGzOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.0.1", - "@angular-eslint/utils": "18.0.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0-alpha.20", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.0.1.tgz", - "integrity": "sha512-u/eov/CFBb8l35D8dW78Dx5fBLd8FZFibKN9XQknhzXnDMpISuUOMny5g5/wvYYjqLgqEySXMiHKEAxEup7xtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.0.1", - "@angular-eslint/utils": "18.0.1", - "aria-query": "5.3.0", - "axobject-query": "4.0.0" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0-alpha.20", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/template-parser": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.0.1.tgz", - "integrity": "sha512-22fKzkWo9Ts8aY/WHL1A6seS2tpltgRRXVfnZnnqvQRyRiuPnx1FC0ly7+QPZkThh8vdLwxU+BvtLq9Uiqh9OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.0.1", - "eslint-scope": "^8.0.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/utils": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.0.1.tgz", - "integrity": "sha512-Q9lCySqg+9h2cz08+SoWj48cY1i04tL1k3bsQJmF2TsylAw2mSsNGX2X3h9WkdxY7sUoY0mP7MVW1iU54Gobcg==", + "node_modules/@angular/build/node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.0.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0-alpha.20", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular/animations": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.1.6.tgz", - "integrity": "sha512-vSU0BP0BzX20HoCE81MKcr9cd6H9zB1qbCNk2J1ulH1C9rXs5ZpeORy+riIJTOZDYLtE0jCsXT3pvVb+nPmADQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "@angular/common": "20.1.6", - "@angular/core": "20.1.6" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/@angular/cli": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.6.tgz", - "integrity": "sha512-kqncVmYtlDYLwt4l5lFBz4uEnoheMH+teSqAAD/zaDxn41KvpoRLHiEVurQhsNP/GDHxGu+8wg0s4gX3kaFOzg==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.14.tgz", + "integrity": "sha512-vlvnxyUtPnETl5az+creSPOrcnrZC5mhD5hSGl2WoqhYeyWdyUwsC9KLSy8/5gCH/4TNwtjqeX3Pw0KaAJUoCQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2001.6", - "@angular-devkit/core": "20.1.6", - "@angular-devkit/schematics": "20.1.6", - "@inquirer/prompts": "7.6.0", - "@listr2/prompt-adapter-inquirer": "2.0.22", - "@modelcontextprotocol/sdk": "1.13.3", - "@schematics/angular": "20.1.6", + "@angular-devkit/architect": "0.2003.14", + "@angular-devkit/core": "20.3.14", + "@angular-devkit/schematics": "20.3.14", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.25.2", + "@schematics/angular": "20.3.14", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.32.0", + "algoliasearch": "5.35.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "npm-package-arg": "12.0.2", - "npm-pick-manifest": "10.0.0", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", "pacote": "21.0.0", "resolve": "1.22.10", "semver": "7.7.2", "yargs": "18.0.0", - "zod": "3.25.75" + "zod": "4.1.13" }, "bin": { "ng": "bin/ng.js" @@ -1394,13 +1539,13 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.2001.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.6.tgz", - "integrity": "sha512-CGFDfqPvKw1Ekuk7eSYMdhBv26LiwBrnZEUnrloC8fnuT8G+s46WMj/uH3tTcQ9MHYbhOSAHynNwpnwX71wghg==", + "version": "0.2003.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.14.tgz", + "integrity": "sha512-dVlWqaYu0PIgHTBu16uYUS6lJOIpXCpOYhPWuYwqdo7a4x2HcagPQ+omUZJTA6kukh7ROpKcRoiy/DsO/DgvUA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.6", + "@angular-devkit/core": "20.3.14", "rxjs": "7.8.2" }, "engines": { @@ -1410,18 +1555,18 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.6.tgz", - "integrity": "sha512-Wooe+nTmHOLvveBQWDmSsdKg39re5BUMGVkwKlPHTQ/YU9aYshvPEBu1K0l4gSqe3qtqVVAx0HlPb53bEFFa8w==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.14.tgz", + "integrity": "sha512-hWQVi73aGdIRInJqNia79Yi6SzqEThkfLug3AdZiNuNvYMaxAI347yPQz4f3Dr/i0QuiqRq/T8zfqbr46tfCqg==", "dev": true, "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", + "picomatch": "4.0.3", "rxjs": "7.8.2", - "source-map": "0.7.4" + "source-map": "0.7.6" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -1438,13 +1583,13 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.6.tgz", - "integrity": "sha512-Maj/yCkn3Qjum2kCYUOYMw8VYh/8725XN8/4cae9VllMwkN5D8jYDvX40qmfgQve2x0x6r3L8rmaIHn8227cHg==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.14.tgz", + "integrity": "sha512-+Al9QojzTucccSUnJI+9x64Nnuev82eIgIlb1Ov9hLR572SNtjhV7zIXIalphFghEy+SPvynRuvOSc69Otp3Fg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.6", + "@angular-devkit/core": "20.3.14", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "8.2.0", @@ -1457,14 +1602,14 @@ } }, "node_modules/@angular/cli/node_modules/@schematics/angular": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.6.tgz", - "integrity": "sha512-1dE+GkpSZbsQxnir/S24g3+pA5sE0XOMxa4Wxhon0dxArP/gH72hsinoVaLDfcQkYOtbbTw/Q8VV41uWBI9eGg==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.14.tgz", + "integrity": "sha512-JO37puMXFWN8YWqZZJ/URs8vPJNszZXcIyBnYdKDWTGaAnbOZMu0nzQlOC+h5NM7R5cPQtOpJv0wxEnY6EYI4A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.6", - "@angular-devkit/schematics": "20.1.6", + "@angular-devkit/core": "20.3.14", + "@angular-devkit/schematics": "20.3.14", "jsonc-parser": "3.3.1" }, "engines": { @@ -1473,10 +1618,20 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/@angular/common": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.1.6.tgz", - "integrity": "sha512-VwV6u5y5NQg5u+Z5A50MCJNpxseny9Rv+csZe9zckH0ylqy9tLowbG6L7jrts36Ze2lwqRag0b+wB0TgrvaT0w==", + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.14.tgz", + "integrity": "sha512-OOUvjTtnpktJLsNupA+GFT2q5zNocPdpOENA8aSrXvAheNybLjgi+otO3U3sQsvB1VwaoEZ9GT5O3lZlstnA/A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1485,14 +1640,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.1.6", + "@angular/core": "20.3.14", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.1.6.tgz", - "integrity": "sha512-PASAnrY3dHl3mOlYP7n49a1djbw+CGeBwkzhSVhDTrkg9hyx6GMDCNdNr1xZFWFjgS7vB3K8nIk8o9k+bXpH0g==", + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.16.tgz", + "integrity": "sha512-Pt9Ms9GwTThgzdxWBwMfN8cH1JEtQ2DK5dc2yxYtPSaD+WKmG9AVL1PrzIYQEbaKcWk2jxASUHpEWSlNiwo8uw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1582,27 +1737,10 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@angular/core": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.1.6.tgz", - "integrity": "sha512-Nz62f9FNcvjOxUivi50YtmEfSdrS7xqpPDoN/jwLkT5VmFfIUFF77sabTF5KTWHCDbp420e2UON6uEblfiRfaw==", + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.16.tgz", + "integrity": "sha512-KSFPKvOmWWLCJBbEO+CuRUXfecX2FRuO0jNi9c54ptXMOPHlK1lIojUnyXmMNzjdHgRug8ci9qDuftvC2B7MKg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1611,7 +1749,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.1.6", + "@angular/compiler": "20.3.16", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" }, @@ -1746,29 +1884,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -1785,13 +1923,13 @@ } }, "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1816,15 +1954,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -1869,17 +2007,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -1899,13 +2037,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -1950,13 +2088,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2083,9 +2221,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2128,12 +2266,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -2143,13 +2281,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2534,14 +2672,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -2583,9 +2721,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", - "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2666,13 +2804,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2743,10 +2881,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2837,9 +2991,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2899,15 +3053,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -3044,9 +3198,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -3286,16 +3440,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", - "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -3391,13 +3545,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" @@ -3473,12 +3627,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -3486,25 +3640,26 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -3521,15 +3676,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -3542,10 +3697,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -3579,15 +3734,15 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" @@ -3600,16 +3755,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -3619,9 +3774,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3642,17 +3797,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -3660,13 +3815,13 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -3676,13 +3831,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -3706,12 +3861,78 @@ } }, "node_modules/@bufbuild/protobuf": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.0.tgz", - "integrity": "sha512-fdRs9PSrBF7QUntpZpq6BTw58fhgGJojgg39m9oFOJGZT+nip9b0so5cYY1oWl5pvemDLr0cPPsH46vwThEbpQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", + "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", "dev": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, + "node_modules/@bundled-es-modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-Rk453EklPUPC3NRWc3VUNI/SSUjdBaFoaQvFRmNBNtMHVtOFD5AntiWg5kEE1hqcPqedYFDzxE3ZcMYPcA195w==", + "license": "ISC", + "dependencies": { + "deepmerge": "^4.3.1" + } + }, + "node_modules/@bundled-es-modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-rt+1650YhlwRkkj67YMZQj5LXWZiavpHQg8K6jDcZBPbrBIooHbKOQvvxKJsKM80H1oHengEbIymfw3mn4FkUw==", + "license": "ISC", + "dependencies": { + "buffer": "^6.0.3", + "events": "^3.3.0", + "glob": "^11.0.3", + "path": "^0.12.7", + "stream": "^0.0.3", + "string_decoder": "^1.3.0", + "url": "^0.11.3" + } + }, + "node_modules/@bundled-es-modules/glob/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/@bundled-es-modules/memfs": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-ykdrkEmQr9BV804yd37ikXfNnvxrwYfY9Z2/EtMHFEFadEjsQXJ1zL9bVZrKNLDtm91UdUOEHso6Aweg93K6xQ==", + "license": "Apache-2.0", + "dependencies": { + "assert": "^2.1.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "memfs": "^4.17.0", + "path": "^0.12.7", + "stream": "^0.0.3", + "util": "^0.12.5" + } + }, + "node_modules/@bundled-es-modules/memfs/node_modules/memfs": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz", + "integrity": "sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3719,7 +3940,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=0.1.90" } @@ -4086,9 +4306,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", - "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", "license": "MIT", "dependencies": { "@emnapi/wasi-threads": "1.1.0", @@ -4096,9 +4316,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", - "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" @@ -4114,9 +4334,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -4131,9 +4351,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -4148,9 +4368,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -4165,9 +4385,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -4182,9 +4402,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -4199,9 +4419,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -4216,9 +4436,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -4233,9 +4453,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -4250,9 +4470,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -4267,9 +4487,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -4284,9 +4504,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -4301,9 +4521,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -4318,9 +4538,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -4335,9 +4555,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -4352,9 +4572,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -4369,9 +4589,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -4386,9 +4606,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -4403,9 +4623,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -4420,9 +4640,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -4437,9 +4657,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -4454,9 +4674,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -4470,10 +4690,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -4488,9 +4725,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -4505,9 +4742,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -4522,9 +4759,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -4558,9 +4795,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -4636,9 +4873,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -4708,6 +4945,29 @@ "npm": ">=6.14.13" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.8.tgz", + "integrity": "sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -4771,9 +5031,9 @@ "license": "BSD-3-Clause" }, "node_modules/@inquirer/ansi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", - "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, "license": "MIT", "engines": { @@ -4781,17 +5041,17 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", - "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4806,14 +5066,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.19", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", - "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" }, "engines": { "node": ">=18" @@ -4828,20 +5088,20 @@ } }, "node_modules/@inquirer/core": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", - "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4856,15 +5116,15 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.21", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", - "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/external-editor": "^1.0.2", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4879,15 +5139,15 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", - "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4902,13 +5162,13 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", + "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "engines": { @@ -4924,9 +5184,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", - "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, "license": "MIT", "engines": { @@ -4934,14 +5194,14 @@ } }, "node_modules/@inquirer/input": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", - "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4956,14 +5216,14 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", - "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4978,15 +5238,15 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", - "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -5001,22 +5261,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.6.0.tgz", - "integrity": "sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", + "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.1.9", - "@inquirer/confirm": "^5.1.13", - "@inquirer/editor": "^4.2.14", - "@inquirer/expand": "^4.0.16", - "@inquirer/input": "^4.2.0", - "@inquirer/number": "^3.0.16", - "@inquirer/password": "^4.0.16", - "@inquirer/rawlist": "^4.1.4", - "@inquirer/search": "^3.0.16", - "@inquirer/select": "^4.2.4" + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" }, "engines": { "node": ">=18" @@ -5031,15 +5291,15 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", - "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -5054,16 +5314,16 @@ } }, "node_modules/@inquirer/search": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", - "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -5078,17 +5338,17 @@ } }, "node_modules/@inquirer/select": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", - "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -5103,9 +5363,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", - "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, "license": "MIT", "engines": { @@ -5124,7 +5384,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, "license": "MIT", "engines": { "node": "20 || >=22" @@ -5134,7 +5393,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, "license": "MIT", "dependencies": { "@isaacs/balanced-match": "^4.0.1" @@ -5147,7 +5405,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -5165,7 +5422,6 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -5178,7 +5434,6 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -5191,7 +5446,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -5207,7 +5461,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -5337,22 +5590,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", @@ -5401,21 +5638,17 @@ } } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/core/node_modules/pretty-format": { @@ -5433,19 +5666,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@jest/core/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -5545,6 +5765,30 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", @@ -5588,77 +5832,73 @@ } } }, - "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": "*" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { + "version": "0.34.47", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", + "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", @@ -5729,22 +5969,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -5768,22 +5992,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -5844,7 +6052,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -5861,7 +6068,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -5878,7 +6084,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -5895,7 +6100,6 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.2", @@ -5922,7 +6126,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", @@ -5943,7 +6146,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", @@ -5968,48 +6170,26 @@ "license": "MIT" }, "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", - "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", + "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/type": "^1.5.5" + "@inquirer/type": "^3.0.7" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.1.tgz", - "integrity": "sha512-kKeP5PaY3bFrrF6GY5aDd96iuh1eoS+5CHJ+7hIP629KIEwzGNwbIzBmEX9TAhRJOivSRDTHCIsbu//+NsYKkg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", + "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", "cpu": [ "arm64" ], @@ -6021,9 +6201,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.1.tgz", - "integrity": "sha512-9CMB3seTyHs3EOVWdKiB8IIEDBJ3Gq00Tqyi0V7DS3HL90BjM/AkbZGuhzXwPrfeFazR24SKaRrUQF74f+CmWw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", + "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", "cpu": [ "x64" ], @@ -6035,9 +6215,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.1.tgz", - "integrity": "sha512-1Mi69vU0akHgCI7tF6YbimPaNEKJiBm/p5A+aM8egr0joj27cQmCCOm2mZQ+Ht2BqmCfZaIgQnMg4gFYNMlpCA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", + "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", "cpu": [ "arm" ], @@ -6049,9 +6229,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.1.tgz", - "integrity": "sha512-d0vuXOdoKjHHJYZ/CRWopnkOiUpev+bgBBW+1tXtWsYWUj8uxl9ZmTBEmsL5mjUlpQDrlYiJSrhOU1hg5QWBSw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", + "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", "cpu": [ "arm64" ], @@ -6063,9 +6243,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.1.tgz", - "integrity": "sha512-00RbEpvfnyPodlICiGFuiOmyvWaL9nzCRSqZz82BVFsGTiSQnnF0gpD1C8tO6OvtptELbtRuM7BS9f97LcowZw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", + "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", "cpu": [ "x64" ], @@ -6077,9 +6257,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.1.tgz", - "integrity": "sha512-4h8tm3i1ODf+28UyqQZLP7c2jmRM26AyEEyYp994B4GiBdGvGAsYUu3oiHANYK9xFpvLuFzyGeqFm1kdNC0D1A==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", + "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", "cpu": [ "arm64" ], @@ -6091,9 +6271,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.1.tgz", - "integrity": "sha512-HqqKIhTbq6piJhkJpTTf3w1m/CgrmwXRAL9R9j7Ru5xdZSeO7Mg4AWiBC9B00uXR+LvVZKtUyRMVZfhmIZztmQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", + "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", "cpu": [ "x64" ], @@ -6105,19 +6285,20 @@ ] }, "node_modules/@microsoft/api-extractor": { - "version": "7.53.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.53.1.tgz", - "integrity": "sha512-bul5eTNxijLdDBqLye74u9494sRmf+9QULtec9Od0uHnifahGeNt8CC4/xCdn7mVyEBrXIQyQ5+sc4Uc0QfBSA==", + "version": "7.55.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.55.0.tgz", + "integrity": "sha512-TYc5OtAK/9E3HGgd2bIfSjQDYIwPc0dysf9rPiwXZGsq916I6W2oww9bhm1OxPOeg6rMfOX3PoroGd7oCryYog==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.31.1", - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.17.0", + "@microsoft/api-extractor-model": "7.32.0", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.18.0", "@rushstack/rig-package": "0.6.0", - "@rushstack/terminal": "0.19.1", - "@rushstack/ts-command-line": "5.1.1", + "@rushstack/terminal": "0.19.3", + "@rushstack/ts-command-line": "5.1.3", + "diff": "~8.0.2", "lodash": "~4.17.15", "minimatch": "10.0.3", "resolve": "~1.22.1", @@ -6130,15 +6311,25 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.31.1.tgz", - "integrity": "sha512-Dhnip5OFKbl85rq/ICHBFGhV4RA5UQSl8AC/P/zoGvs+CBudPkatt5kIhMGiYgVPnUWmfR6fcp38+1AFLYNtUw==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.0.tgz", + "integrity": "sha512-QIVJSreb8fGGJy1Qx0yzGVXxvHJN1WXgkFNHFheVv1iBJNqgvp+xeT3ienJmRwXmPPc5Es/cxBrXtKZJR3i7iw==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.17.0" + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.18.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { @@ -6218,20 +6409,20 @@ "license": "ISC" }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", "dev": true, "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", - "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz", + "integrity": "sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.15.1", + "@microsoft/tsdoc": "0.16.0", "ajv": "~8.12.0", "jju": "~1.4.0", "resolve": "~1.22.2" @@ -6255,13 +6446,15 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.13.3.tgz", - "integrity": "sha512-bGwA78F/U5G2jrnsdRkPY3IwIwZeWUEfb5o764b79lb0rJmMT76TLwKhdNZOWakOQtedYefwIR4emisEMvInKA==", + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", + "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.6", + "@hono/node-server": "^1.19.7", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", @@ -6269,92 +6462,37 @@ "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" }, "engines": { "node": ">=18" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@modern-js/node-bundle-require": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.68.2.tgz", - "integrity": "sha512-MWk/pYx7KOsp+A/rN0as2ji/Ba8x0m129aqZ3Lj6T6CCTWdz0E/IsamPdTmF9Jnb6whQoBKtWSaLTCQlmCoY0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@modern-js/utils": "2.68.2", - "@swc/helpers": "^0.5.17", - "esbuild": "0.25.5" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@modern-js/utils": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.68.2.tgz", - "integrity": "sha512-revom/i/EhKfI0STNLo/AUbv7gY0JY0Ni2gO6P/Z4cTyZZRgd5j90678YB2DGn+LtmSrEWtUphyDH5Jn1RKjgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@swc/helpers": "^0.5.17", - "caniuse-lite": "^1.0.30001520", - "lodash": "^4.17.21", - "rslog": "^1.1.0" - } - }, - "node_modules/@modern-js/utils/node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } } }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.18.4.tgz", - "integrity": "sha512-tYgso9izSinWzzVlsOUsBjW5lPMsvsVp95Jrw5W4Ajg9Un/yTkjOqEqmsMYpiL7drEN2+gPPVYyQ/hUK4QWz8Q==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.21.6.tgz", + "integrity": "sha512-lJMmdhD4VKVkeg8RHb+Jwe6Ou9zKVgjtb1inEURDG/sSS2ksdZA8pVKLYbRPRbdmjr193Y8gJfqFbI2dqoyc/g==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.18.4", + "@module-federation/sdk": "0.21.6", "@types/semver": "7.5.8", "semver": "7.6.3" } @@ -6373,17 +6511,17 @@ } }, "node_modules/@module-federation/cli": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.18.4.tgz", - "integrity": "sha512-31c+2OjtRdsYq7oV+rCoTO9AXizT3D9CNzofZ9EVRGsaS9+H+nJKTkK+pw+IhK0Y8I0HsP+uxgLrazqF0tLbgg==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.21.6.tgz", + "integrity": "sha512-qNojnlc8pTyKtK7ww3i/ujLrgWwgXqnD5DcDPsjADVIpu7STaoaVQ0G5GJ7WWS/ajXw6EyIAAGW/AMFh4XUxsQ==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/node-bundle-require": "2.68.2", - "@module-federation/dts-plugin": "0.18.4", - "@module-federation/sdk": "0.18.4", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/sdk": "0.21.6", "chalk": "3.0.0", - "commander": "11.1.0" + "commander": "11.1.0", + "jiti": "2.4.2" }, "bin": { "mf": "bin/mf.js" @@ -6392,15 +6530,29 @@ "node": ">=16.0.0" } }, + "node_modules/@module-federation/cli/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@module-federation/data-prefetch": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.18.4.tgz", - "integrity": "sha512-XOHFFO1wrVbjjfP2JRMbht+ILim5Is6Mfb5f2H4I9w0CSaZNRltG0fTnebECB1jgosrd8xaYnrwzXsCI/S53qQ==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.21.6.tgz", + "integrity": "sha512-8HD7ZhtWZ9vl6i3wA7M8cEeCRdtvxt09SbMTfqIPm+5eb/V4ijb8zGTYSRhNDb5RCB+BAixaPiZOWKXJ63/rVw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.18.4", - "@module-federation/sdk": "0.18.4", + "@module-federation/runtime": "0.21.6", + "@module-federation/sdk": "0.21.6", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -6409,23 +6561,23 @@ } }, "node_modules/@module-federation/dts-plugin": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.18.4.tgz", - "integrity": "sha512-5FlrajLCypQ8+vEsncgEGpDmxUDG+Ub6ogKOE00e2gMxcYlgcCZNUSn5VbEGdCMcHQmIK2xt3WGQT30/7j2KiQ==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.21.6.tgz", + "integrity": "sha512-YIsDk8/7QZIWn0I1TAYULniMsbyi2LgKTi9OInzVmZkwMC6644x/ratTWBOUDbdY1Co+feNkoYeot1qIWv2L7w==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.18.4", - "@module-federation/managers": "0.18.4", - "@module-federation/sdk": "0.18.4", - "@module-federation/third-party-dts-extractor": "0.18.4", + "@module-federation/error-codes": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/sdk": "0.21.6", + "@module-federation/third-party-dts-extractor": "0.21.6", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", - "axios": "^1.11.0", + "axios": "^1.12.0", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", - "koa": "3.0.1", + "koa": "3.0.3", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", @@ -6442,24 +6594,38 @@ } } }, + "node_modules/@module-federation/dts-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@module-federation/enhanced": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.18.4.tgz", - "integrity": "sha512-KiBw7e+aIBFoO2cmN5hJlKrYv3nUuXsB8yOSVnV9JBAkYNyRZQ9xoSbRCDt8rDRz/ydgEURUIwnGyL2ZU5jZYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.18.4", - "@module-federation/cli": "0.18.4", - "@module-federation/data-prefetch": "0.18.4", - "@module-federation/dts-plugin": "0.18.4", - "@module-federation/error-codes": "0.18.4", - "@module-federation/inject-external-runtime-core-plugin": "0.18.4", - "@module-federation/managers": "0.18.4", - "@module-federation/manifest": "0.18.4", - "@module-federation/rspack": "0.18.4", - "@module-federation/runtime-tools": "0.18.4", - "@module-federation/sdk": "0.18.4", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.21.6.tgz", + "integrity": "sha512-8PFQxtmXc6ukBC4CqGIoc96M2Ly9WVwCPu4Ffvt+K/SB6rGbeFeZoYAwREV1zGNMJ5v5ly6+AHIEOBxNuSnzSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.21.6", + "@module-federation/cli": "0.21.6", + "@module-federation/data-prefetch": "0.21.6", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/error-codes": "0.21.6", + "@module-federation/inject-external-runtime-core-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/manifest": "0.21.6", + "@module-federation/rspack": "0.21.6", + "@module-federation/runtime-tools": "0.21.6", + "@module-federation/sdk": "0.21.6", "btoa": "^1.2.1", "schema-utils": "^4.3.0", "upath": "2.0.1" @@ -6485,58 +6651,72 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.18.4.tgz", - "integrity": "sha512-cpLsqL8du9CfTTCKvXbRg93ALF+lklqHnuPryhbwVEQg2eYo6CMoMQ6Eb7kJhLigUABIDujbHD01SvBbASGkeQ==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.21.6.tgz", + "integrity": "sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.18.4.tgz", - "integrity": "sha512-x+IakEXu+ammna2SMKkb1NRDXKxhKckOJIYanNHh1FtG2bvhu8xJplShvStmfO+BUv1n0KODSq89qGVYxFMbGQ==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.21.6.tgz", + "integrity": "sha512-DJQne7NQ988AVi3QB8byn12FkNb+C2lBeU1NRf8/WbL0gmHsr6kW8hiEJCm8LYaURwtsQqtsEV7i+8+51qjSmQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.18.4" + "@module-federation/runtime-tools": "0.21.6" } }, "node_modules/@module-federation/managers": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.18.4.tgz", - "integrity": "sha512-wJ8wheGNq4vnaLHx17F8Y0L+T9nzO5ijqMxQ7q9Yohm7MGeC5DoSjjurv/afxL6Dg5rGky+kHsYGM4qRTMFXaA==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.21.6.tgz", + "integrity": "sha512-BeV6m2/7kF5MDVz9JJI5T8h8lMosnXkH2bOxxFewcra7ZjvDOgQu7WIio0mgk5l1zjNPvnEVKhnhrenEdcCiWg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.18.4", + "@module-federation/sdk": "0.21.6", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/manifest": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.18.4.tgz", - "integrity": "sha512-1+sfldRpYmJX/SDqG3gWeeBbPb0H0eKyQcedf77TQGwFypVAOJwI39qV0yp3FdjutD7GdJ2TGPBHnGt7AbEvKA==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.21.6.tgz", + "integrity": "sha512-yg93+I1qjRs5B5hOSvjbjmIoI2z3th8/yst9sfwvx4UDOG1acsE3HHMyPN0GdoIGwplC/KAnU5NmUz4tREUTGQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.18.4", - "@module-federation/managers": "0.18.4", - "@module-federation/sdk": "0.18.4", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/sdk": "0.21.6", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, + "node_modules/@module-federation/manifest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@module-federation/node": { - "version": "2.7.20", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.20.tgz", - "integrity": "sha512-skWab7iB/+M8xOCGFOl6zqhFcBNEc4+J3Xc6mB3NBmraDH4oAB2JDuPqpJ3fRrk3MILoQ8SdlQOgnClWyTZ3Jg==", + "version": "2.7.26", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.26.tgz", + "integrity": "sha512-C7aIABSxbZKOvVDMIivmV9Q/aOVh9xpUv+y+nwSWuQr9v2pgmMzVK3rxWoeusmkpaENia8h5AWNpYjcrMi+O9g==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "0.21.1", - "@module-federation/runtime": "0.21.1", - "@module-federation/sdk": "0.21.1", + "@module-federation/enhanced": "0.22.0", + "@module-federation/runtime": "0.22.0", + "@module-federation/sdk": "0.22.0", "btoa": "1.2.1", "encoding": "^0.1.13", "node-fetch": "2.7.0" @@ -6559,29 +6739,29 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.21.1.tgz", - "integrity": "sha512-NpOFi1hvkgvDvQS+ItWbcI+ZAdEN90lURgMn6wsY9GGWtcmrlIZcrt5LMHmhgZfukqzZMFu/7IV+NoZumg8gZA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.22.0.tgz", + "integrity": "sha512-OzMBBbUhOMbDVX/wkVDxaOshgyUdxv+kRQDtxl1/ipV5GXTjs1tpS4NHtDwiJi0qKeG0AvnvGCrPu7bjMOcAVw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.21.1", + "@module-federation/sdk": "0.22.0", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/cli": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.21.1.tgz", - "integrity": "sha512-dgJcI4tC2X/Ds5xQSGg5REpqxqyJb0xLMNKRoYeJCRM3amW6vxRTw0Ww02yY0+50Oz002Z7QMuPjNo53lox2jw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.22.0.tgz", + "integrity": "sha512-kdeDg6HuOqJYKtPeoupWQg6wLZT7B+AwMDwMjwhcKHxKEmKFPImbJLymBWEgmKTktZKh1ERtEOplwFt9u5iEBA==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/node-bundle-require": "2.68.2", - "@module-federation/dts-plugin": "0.21.1", - "@module-federation/sdk": "0.21.1", + "@module-federation/dts-plugin": "0.22.0", + "@module-federation/sdk": "0.22.0", "chalk": "3.0.0", - "commander": "11.1.0" + "commander": "11.1.0", + "jiti": "2.4.2" }, "bin": { "mf": "bin/mf.js" @@ -6591,14 +6771,14 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.21.1.tgz", - "integrity": "sha512-zwBjxr208Ah099Gi6exORUkgw1K9WUyLog7LGWP2kmmbTHAXVS+uolfnn7/45cbUgFHcIB+AnozcH00vDe23Bg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.22.0.tgz", + "integrity": "sha512-NESR/5Wcn9unPY18oQSSXlbXTnMbUFwqqvSZnpJt5vBb/8QlcJEiPnxERZqKhKrIS6GTD8KneHPRCOQsP6Xcqw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.21.1", - "@module-federation/sdk": "0.21.1", + "@module-federation/runtime": "0.22.0", + "@module-federation/sdk": "0.22.0", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -6607,23 +6787,23 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.21.1.tgz", - "integrity": "sha512-hdcG3h3J3yYd2U2GnLoL6GJS6QZ9amdVXwp1vfWQ2V/LlwJIHTFjUwmNMHA4bPRu2iMfcGzprtwU53+SE7it7g==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.22.0.tgz", + "integrity": "sha512-lj5YtUZz0moaT1XziM0OyizE0mIhMa8W65RUiX/+UZ4iNK/KMs4e/CGpfhEt2Lj9+j6KYSzI2+676d+73j/kag==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.21.1", - "@module-federation/managers": "0.21.1", - "@module-federation/sdk": "0.21.1", - "@module-federation/third-party-dts-extractor": "0.21.1", + "@module-federation/error-codes": "0.22.0", + "@module-federation/managers": "0.22.0", + "@module-federation/sdk": "0.22.0", + "@module-federation/third-party-dts-extractor": "0.22.0", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.12.0", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", - "koa": "3.0.1", + "koa": "3.0.3", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", @@ -6641,23 +6821,23 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.21.1.tgz", - "integrity": "sha512-YdriBRiddbvj2AnBsugkfFtqM152I7oHK4sy64+Cg/MMok4r5lPMuju7NKlH5bW9xTJosHWAV9hcAdWR6Pkh9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.21.1", - "@module-federation/cli": "0.21.1", - "@module-federation/data-prefetch": "0.21.1", - "@module-federation/dts-plugin": "0.21.1", - "@module-federation/error-codes": "0.21.1", - "@module-federation/inject-external-runtime-core-plugin": "0.21.1", - "@module-federation/managers": "0.21.1", - "@module-federation/manifest": "0.21.1", - "@module-federation/rspack": "0.21.1", - "@module-federation/runtime-tools": "0.21.1", - "@module-federation/sdk": "0.21.1", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.22.0.tgz", + "integrity": "sha512-OysyO6xbhpP+CeOEDp2v6HyFcVT5wWAdQrfga3jhlFUAdIR7nZZ2albysnF2CGn/xyU050Ss74ttgy7GiKi5fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.22.0", + "@module-federation/cli": "0.22.0", + "@module-federation/data-prefetch": "0.22.0", + "@module-federation/dts-plugin": "0.22.0", + "@module-federation/error-codes": "0.22.0", + "@module-federation/inject-external-runtime-core-plugin": "0.22.0", + "@module-federation/managers": "0.22.0", + "@module-federation/manifest": "0.22.0", + "@module-federation/rspack": "0.22.0", + "@module-federation/runtime-tools": "0.22.0", + "@module-federation/sdk": "0.22.0", "btoa": "^1.2.1", "schema-utils": "^4.3.0", "upath": "2.0.1" @@ -6683,62 +6863,62 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.21.1.tgz", - "integrity": "sha512-h1brnwR9AbwMu1P7ZoJJ9j2O2XWkuMh5p03WhXI1vNEdl3xJheSAvH8RjG8FoKRccVgMnUNDQ+vDVwevUBms/A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", + "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.21.1.tgz", - "integrity": "sha512-K90tlIA1bbQeqmfYMPlg76gS+ZDyqZrqax5x/QJbd6jANhRwSf05FNSoDBrjeCGBZy9HK54OtL40t6JLYITB0g==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.22.0.tgz", + "integrity": "sha512-zeN6XiLV9l0tAsZzQxHLEQM28sWiijmIBp9CiIDc4iqk2f/kgCSqiBWTiNcS4sZODzupPkktaWsC5+5eWk0ENQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.21.1" + "@module-federation/runtime-tools": "0.22.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/managers": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.21.1.tgz", - "integrity": "sha512-SKPjbp26S0YD6XdcwK58TLxqrgwIG0EKuvvB9JgCYpWN2lpdzIQogcpljYBrbGtUI3tZIv7gTGRQrXO22NiPxw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.22.0.tgz", + "integrity": "sha512-Ptv8gEUihPBeoQEpsKq3GZUEB4y/hqG83mKw5NrKpXMIfcoF6SZjcknXz5LuN7NF3xMi1XHYU74z/nKzr+izew==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.21.1", + "@module-federation/sdk": "0.22.0", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.21.1.tgz", - "integrity": "sha512-Akop0xswM9KzIMww+ltzz2FGyFsymPkyPPtLFb3K0p3Ymgi0DT29oM07ry8ybgB4XPa48Fsm1ToO0I+ZTp+Wbg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.22.0.tgz", + "integrity": "sha512-Exv+frMkRGKDs3KKXeBBKcHvL7nNTk5Yt2ftEvxCUIRPC16Ebvy6RcQvFFvbvmOhuM/If6j6E/aZu5Z9oau6xw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.21.1", - "@module-federation/managers": "0.21.1", - "@module-federation/sdk": "0.21.1", + "@module-federation/dts-plugin": "0.22.0", + "@module-federation/managers": "0.22.0", + "@module-federation/sdk": "0.22.0", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.21.1.tgz", - "integrity": "sha512-Oxuw1ybRc7pQEw+iP1BnbNSi5EQwh+YZVwfqdkYeruuTJfSSqdgQ4JQKhNTQ1ECLqjlvRWLiD1EErw1QQGUA4A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.22.0.tgz", + "integrity": "sha512-PvDlFxzCbufArZvt6wSLsJNm20hdDsz/4X04YAxAZfp/dTECZghZsebLcR7nHOzOwR2gCX8vv+gB3r+5MheobA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.21.1", - "@module-federation/dts-plugin": "0.21.1", - "@module-federation/inject-external-runtime-core-plugin": "0.21.1", - "@module-federation/managers": "0.21.1", - "@module-federation/manifest": "0.21.1", - "@module-federation/runtime-tools": "0.21.1", - "@module-federation/sdk": "0.21.1", + "@module-federation/bridge-react-webpack-plugin": "0.22.0", + "@module-federation/dts-plugin": "0.22.0", + "@module-federation/inject-external-runtime-core-plugin": "0.22.0", + "@module-federation/managers": "0.22.0", + "@module-federation/manifest": "0.22.0", + "@module-federation/runtime-tools": "0.22.0", + "@module-federation/sdk": "0.22.0", "btoa": "1.2.1" }, "peerDependencies": { @@ -6756,50 +6936,50 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.21.1.tgz", - "integrity": "sha512-sfBrP0gEPwXPEiREVKVd0IjEWXtr3G/i7EUZVWTt4D491nNpswog/kuKFatGmhcBb+9uD5v9rxFgmIbgL9njnQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", + "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.21.1", - "@module-federation/runtime-core": "0.21.1", - "@module-federation/sdk": "0.21.1" + "@module-federation/error-codes": "0.22.0", + "@module-federation/runtime-core": "0.22.0", + "@module-federation/sdk": "0.22.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.21.1.tgz", - "integrity": "sha512-COob5bepqDc9mKjTziXbQd4WQMCTzhc0cuXyraZhYddYcjcepzZrMpDIXG1x5p+gdg5p1vsGNWt/ZcU8cFh/pg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", + "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.21.1", - "@module-federation/sdk": "0.21.1" + "@module-federation/error-codes": "0.22.0", + "@module-federation/sdk": "0.22.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.21.1.tgz", - "integrity": "sha512-uQmammw3Osg8370yiRqZwKo7eA5zkyml9pAX9x4oS9QAkEBvQpDogERlF9f7gAgcP2P3v+xLg3/bCdquD0gt8A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", + "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.21.1", - "@module-federation/webpack-bundler-runtime": "0.21.1" + "@module-federation/runtime": "0.22.0", + "@module-federation/webpack-bundler-runtime": "0.22.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.21.1.tgz", - "integrity": "sha512-1cHMrmCCao3NMFM4BkA0GDt4rbYbyneHct5E4z68cu5UBUnI3L/UboP5VNM8lkYMO1nCR8M0FcLkLhK35Nt48A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", + "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.21.1.tgz", - "integrity": "sha512-Oymvh3XTokJhvZE+v9ZInc+pgtqA/nHyLXD0AsZlIxh+BLsCtIkChQPQt6rf+VzrGAdBV3gmeBN2wQWr40M2TQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.22.0.tgz", + "integrity": "sha512-3y2DZdeEjArNKDqA1Ds32Q6A5RATcsmywCXyQaWcfaScprpmzfEWiDkeD/nzoA/0+4ePY8OEinJ4hLtoMNLbLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6809,14 +6989,28 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.1.tgz", - "integrity": "sha512-yyXX6ugTV07pMxMzAHt6/JDwblS3f1NDyUI7l44CyYgXpl2ItEEUs5aj5h/5xU1c9Px7M//KkY3qW+InW4tR/A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", + "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.21.1", - "@module-federation/sdk": "0.21.1" + "@module-federation/runtime": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "node_modules/@module-federation/node/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@module-federation/node/node_modules/resolve": { @@ -6851,19 +7045,19 @@ } }, "node_modules/@module-federation/rspack": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.18.4.tgz", - "integrity": "sha512-gnvXKtk/w0ML15JHueWej5/8Lkoho7EoYUxvO77nBCnGOlXNqVYqLZ3REy2SS/8SQ4vQK156eSiyUkth2OYQqw==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.21.6.tgz", + "integrity": "sha512-SB+z1P+Bqe3R6geZje9dp0xpspX6uash+zO77nodmUy8PTTBlkL7800Cq2FMLKUdoTZHJTBVXf0K6CqQWSlItg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.18.4", - "@module-federation/dts-plugin": "0.18.4", - "@module-federation/inject-external-runtime-core-plugin": "0.18.4", - "@module-federation/managers": "0.18.4", - "@module-federation/manifest": "0.18.4", - "@module-federation/runtime-tools": "0.18.4", - "@module-federation/sdk": "0.18.4", + "@module-federation/bridge-react-webpack-plugin": "0.21.6", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/inject-external-runtime-core-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/manifest": "0.21.6", + "@module-federation/runtime-tools": "0.21.6", + "@module-federation/sdk": "0.21.6", "btoa": "1.2.1" }, "peerDependencies": { @@ -6881,50 +7075,50 @@ } }, "node_modules/@module-federation/runtime": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.18.4.tgz", - "integrity": "sha512-2et6p7pjGRHzpmrW425jt/BiAU7QHgkZtbQB7pj01eQ8qx6SloFEBk9ODnV8/ztSm9H2T3d8GxXA6/9xVOslmQ==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.21.6.tgz", + "integrity": "sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.18.4", - "@module-federation/runtime-core": "0.18.4", - "@module-federation/sdk": "0.18.4" + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" } }, "node_modules/@module-federation/runtime-core": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.18.4.tgz", - "integrity": "sha512-LGGlFXlNeTbIGBFDiOvg0zz4jBWCGPqQatXdKx7mylXhDij7YmwbuW19oenX+P1fGhmoBUBM5WndmR87U66qWA==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.21.6.tgz", + "integrity": "sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.18.4", - "@module-federation/sdk": "0.18.4" + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.18.4.tgz", - "integrity": "sha512-wSGTdx77R8BQX+q6nAcUuHPydYYm0F97gAEP9RTW1UlzXnM/0AFysDHujvtRQf5vyXkhj//HdcH6LIJJCImy2g==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.21.6.tgz", + "integrity": "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.18.4", - "@module-federation/webpack-bundler-runtime": "0.18.4" + "@module-federation/runtime": "0.21.6", + "@module-federation/webpack-bundler-runtime": "0.21.6" } }, "node_modules/@module-federation/sdk": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.18.4.tgz", - "integrity": "sha512-dErzOlX+E3HS2Sg1m12Hi9nCnfvQPuIvlq9N47KxrbT2TIU3KKYc9q/Ua+QWqxfTyMVFpbNDwFMJ1R/w/gYf4A==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.21.6.tgz", + "integrity": "sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.18.4.tgz", - "integrity": "sha512-PpiC0jxOegNR/xjhNOkjSYnUqMNJAy1kWsRd10to3Y64ZvGRf7/HF+x3aLIX8MbN7Ioy9F7Gd5oax6rtm+XmNQ==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.21.6.tgz", + "integrity": "sha512-Il6x4hLsvCgZNk1DFwuMBNeoxD1BsZ5AW2BI/nUgu0k5FiAvfcz1OFawRFEHtaM/kVrCsymMOW7pCao90DaX3A==", "dev": true, "license": "MIT", "dependencies": { @@ -6952,14 +7146,14 @@ } }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.18.4.tgz", - "integrity": "sha512-nPHp2wRS4/yfrGRQchZ0cyvdUZk+XgUmD0qWQl95xmeIeXUb90s3JrWFHSmS6Dt1gwMgJOeNpzzZDcBSy2P1VQ==", + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.6.tgz", + "integrity": "sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.18.4", - "@module-federation/sdk": "0.18.4" + "@module-federation/runtime": "0.21.6", + "@module-federation/sdk": "0.21.6" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { @@ -7383,9 +7577,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.1.5.tgz", - "integrity": "sha512-QAiGzqxHhdV3uh53GlXHegVEnK5GmS90Hqqhx2lLnhWCI7blpe2CuG+BuIWMXMUck9NUz6kR6jPysQYA5ENATA==", + "version": "20.3.10", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.10.tgz", + "integrity": "sha512-W/+CGQFhmYEMJ/YgkC5p9khkxu2ocrvM0Pe0GxcUldrpBpdm1GCphEH1kTo7MeCupUK4/6rXGUt+GoA6PYchOg==", "dev": true, "license": "MIT", "engines": { @@ -7395,7 +7589,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^20.0.0", - "typescript": ">=5.8 <5.9", + "typescript": ">=5.8 <6.0", "webpack": "^5.54.0" } }, @@ -7570,6 +7764,26 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@npmcli/promise-spawn": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", @@ -7672,19 +7886,47 @@ "@nx/devkit": "19.5.4" } }, - "node_modules/@nrwl/devkit/node_modules/@napi-rs/wasm-runtime": { + "node_modules/@nrwl/devkit/node_modules/@nx/devkit": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.4.tgz", + "integrity": "sha512-0TG2iU0xVRuElLP2aLeRSKUynsC+UgHqE/FJW2IcglHngs2/Duw2A4HDUVVOxztkEQPmp736qkYSwFO0nlOGxg==", + "license": "MIT", + "dependencies": { + "@nrwl/devkit": "19.5.4", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 17 <= 20" + } + }, + "node_modules/@nrwl/jest": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-19.5.4.tgz", + "integrity": "sha512-dlu7LBtD4RYavMZ0sBz9NqkYc1YbMYDM/637xDWRdZV17tG7214ATyA0YgVb15UisTkWQpns2tLBXQ/UbkJvFA==", + "license": "MIT", + "dependencies": { + "@nx/jest": "19.5.4" + } + }, + "node_modules/@nrwl/jest/node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "license": "MIT", - "peer": true, "dependencies": { "@emnapi/core": "^1.1.0", "@emnapi/runtime": "^1.1.0", "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/devkit": { + "node_modules/@nrwl/jest/node_modules/@nx/devkit": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.4.tgz", "integrity": "sha512-0TG2iU0xVRuElLP2aLeRSKUynsC+UgHqE/FJW2IcglHngs2/Duw2A4HDUVVOxztkEQPmp736qkYSwFO0nlOGxg==", @@ -7704,10 +7946,78 @@ "nx": ">= 17 <= 20" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", - "integrity": "sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg==", + "node_modules/@nrwl/jest/node_modules/@nx/jest": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-19.5.4.tgz", + "integrity": "sha512-u05B4j5pfGs+lnRrlpW6s2xECSkBOileroTITUp8xl0/GQnFyBAgFolu2iqH9M/e4+gykzMEsHyK/eZrPUt20A==", + "license": "MIT", + "dependencies": { + "@jest/reporters": "^29.4.1", + "@jest/test-result": "^29.4.1", + "@nrwl/jest": "19.5.4", + "@nx/devkit": "19.5.4", + "@nx/js": "19.5.4", + "@phenomnomnominal/tsquery": "~5.0.1", + "chalk": "^4.1.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "^29.4.1", + "jest-resolve": "^29.4.1", + "jest-util": "^29.4.1", + "minimatch": "9.0.3", + "resolve.exports": "1.1.0", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nrwl/jest/node_modules/@nx/js": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-19.5.4.tgz", + "integrity": "sha512-PkilOEL/JyQrZjTeuPc1Z+LfJ3kr6/Lxas/hzAjENh2mleNjaDgDVP4/2KxvHexP09wu6BARNDdsK1sXMhpPyA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nrwl/js": "19.5.4", + "@nx/devkit": "19.5.4", + "@nx/workspace": "19.5.4", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "fast-glob": "3.2.7", + "fs-extra": "^11.1.0", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "minimatch": "9.0.3", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^5.0.4" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nrwl/jest/node_modules/@nx/nx-darwin-arm64": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.4.tgz", + "integrity": "sha512-s+OmSsYUtECmEKAdzSsYoO9vamx+njiP72eSZusmTh7fCJg+dW3dcifRkUf3h1dcM53hffXcmxKEoWxZMAeuXw==", "cpu": [ "arm64" ], @@ -7716,15 +8026,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-darwin-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz", - "integrity": "sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-darwin-x64": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.5.4.tgz", + "integrity": "sha512-GjA6aThF9P7FR3OdNZn4g9c1bJeQMOdQmo2jaBaGmUPnOIZSEWinHkvh5g8vDg+jNwRdHKK84jJWWW0/o73iYQ==", "cpu": [ "x64" ], @@ -7733,15 +8042,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz", - "integrity": "sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-freebsd-x64": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.5.4.tgz", + "integrity": "sha512-KPVTmg2NpvON3+sh2pNWv2GJow5CL3fX2xBo4cI9D50DDZOD4fB68S2v5q6nLC1QWOwQcC0PLnSpoKaDB0PgQg==", "cpu": [ "x64" ], @@ -7750,15 +8058,14 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz", - "integrity": "sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.5.4.tgz", + "integrity": "sha512-a535HwxVhTS+ngcoFxrsqmggpsKWquubILZhIeY/q+XW6nX61FEb/EqlMkc+aJLHD1LQBGax1W+j7YvTA/66Lw==", "cpu": [ "arm" ], @@ -7767,15 +8074,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz", - "integrity": "sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.5.4.tgz", + "integrity": "sha512-eRu/IoPB68MQeEmfyub+P79eDYvXOyNa706rp0JnDHL5LMw12kPF3MIeqc/v7o6xWakGHCSnTCulcqsl8HXryg==", "cpu": [ "arm64" ], @@ -7784,15 +8090,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz", - "integrity": "sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.5.4.tgz", + "integrity": "sha512-r5NNVngNwTe+zpUAAZAgCezDkjc0pi2zrr8VwiaRZsmVjhHtvvsXJgo1ONw5s2HjKoKuTFEa5jKTUlAHkaQ7Kg==", "cpu": [ "arm64" ], @@ -7801,15 +8106,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz", - "integrity": "sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.5.4.tgz", + "integrity": "sha512-8TWwjyp/bK2a/CHK2HuC7I8iITC9ytEvfru8/kw1mSyoK4kSDlzkL/1uDl536ULXLWORulfEzaGb61GynVc1vg==", "cpu": [ "x64" ], @@ -7818,15 +8122,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz", - "integrity": "sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-x64-musl": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.5.4.tgz", + "integrity": "sha512-5Pf32iv9nnmSV/oOHd9k/5L45m3BooSj096G/ejAN3BHMr4CZIMhjDcQq9ZX7pAZFchU5zL0+dNClK70QfA7PA==", "cpu": [ "x64" ], @@ -7835,15 +8138,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz", - "integrity": "sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.5.4.tgz", + "integrity": "sha512-fyKGfde4Pq9r5qQMLIleujq7B5ta86y8RSPUruoN6zaGrNg6waqbpMdZUjjsg9L7PP9RPaMHPMubC21OnQQomQ==", "cpu": [ "arm64" ], @@ -7852,15 +8154,14 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz", - "integrity": "sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew==", + "node_modules/@nrwl/jest/node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.5.4.tgz", + "integrity": "sha512-gcAr5zZQKiAxHZ7iUOVeMLf/KIh4EFbF07Q0uSmgGmUJL1u3mZTjeG57V1AMZbTQESGY43rgoymqVYkghc5Jlw==", "cpu": [ "x64" ], @@ -7869,44 +8170,63 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nrwl/devkit/node_modules/@tybys/wasm-util": { + "node_modules/@nrwl/jest/node_modules/@nx/workspace": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.4.tgz", + "integrity": "sha512-GI3uMJYwPxjPGHA0UuXZtIqf/fgiCDq63Ns7zpdzwaeOvQbtHySFVV6zclXx/3dXjJsBpEiOYNKPGf17jqx6Dw==", + "license": "MIT", + "dependencies": { + "@nrwl/workspace": "19.5.4", + "@nx/devkit": "19.5.4", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "19.5.4", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nrwl/jest/node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.4.0" } }, - "node_modules/@nrwl/devkit/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": true, + "node_modules/@nrwl/jest/node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14.15.0" + } + }, + "node_modules/@nrwl/jest/node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" } }, - "node_modules/@nrwl/devkit/node_modules/cli-cursor": { + "node_modules/@nrwl/jest/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -7914,29 +8234,96 @@ "node": ">=8" } }, - "node_modules/@nrwl/devkit/node_modules/define-lazy-prop": { + "node_modules/@nrwl/jest/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/jest/node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/@nrwl/devkit/node_modules/emoji-regex": { + "node_modules/@nrwl/jest/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/@nrwl/jest/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/jest/node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "license": "MIT", - "peer": true + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@nrwl/jest/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nrwl/jest/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } }, - "node_modules/@nrwl/devkit/node_modules/is-docker": { + "node_modules/@nrwl/jest/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", - "peer": true, "bin": { "is-docker": "cli.js" }, @@ -7947,32 +8334,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/devkit/node_modules/is-fullwidth-code-point": { + "node_modules/@nrwl/jest/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/@nrwl/devkit/node_modules/is-interactive": { + "node_modules/@nrwl/jest/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/@nrwl/devkit/node_modules/is-unicode-supported": { + "node_modules/@nrwl/jest/node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -7980,12 +8364,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/devkit/node_modules/is-wsl": { + "node_modules/@nrwl/jest/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -7993,19 +8376,17 @@ "node": ">=8" } }, - "node_modules/@nrwl/devkit/node_modules/jsonc-parser": { + "node_modules/@nrwl/jest/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "license": "MIT", - "peer": true + "license": "MIT" }, - "node_modules/@nrwl/devkit/node_modules/log-symbols": { + "node_modules/@nrwl/jest/node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -8017,19 +8398,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/devkit/node_modules/nx": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.2.tgz", - "integrity": "sha512-mDKpbH3vEpUFDx0rrLh+tTqLq1PYU8KiD/R7OVZGd1FxQxghx2HOl32MiqNsfPcw6AvKlXhslbwIESV+N55FLQ==", + "node_modules/@nrwl/jest/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@nrwl/jest/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/jest/node_modules/nx": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.4.tgz", + "integrity": "sha512-zfxIFe+29Na6GKlmPPzQhCjnBv5HoLaT43mYZdHh3BPrVOzWBCXNwxWROG1ZK9IcUepwySWq7NI/H3w8BGPEGg==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.5.4", "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", + "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", + "axios": "^1.7.2", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -8040,23 +8442,23 @@ "figures": "3.2.0", "flat": "^5.0.2", "front-matter": "^4.0.2", + "fs-extra": "^11.1.0", "ignore": "^5.0.4", "jest-diff": "^29.4.1", "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", + "lines-and-columns": "~2.0.3", "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", "open": "^8.4.0", "ora": "5.3.0", - "resolve.exports": "2.0.3", "semver": "^7.5.3", "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", - "yaml": "^2.6.0", "yargs": "^17.6.2", "yargs-parser": "21.1.1" }, @@ -8065,16 +8467,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.2", - "@nx/nx-darwin-x64": "20.8.2", - "@nx/nx-freebsd-x64": "20.8.2", - "@nx/nx-linux-arm-gnueabihf": "20.8.2", - "@nx/nx-linux-arm64-gnu": "20.8.2", - "@nx/nx-linux-arm64-musl": "20.8.2", - "@nx/nx-linux-x64-gnu": "20.8.2", - "@nx/nx-linux-x64-musl": "20.8.2", - "@nx/nx-win32-arm64-msvc": "20.8.2", - "@nx/nx-win32-x64-msvc": "20.8.2" + "@nx/nx-darwin-arm64": "19.5.4", + "@nx/nx-darwin-x64": "19.5.4", + "@nx/nx-freebsd-x64": "19.5.4", + "@nx/nx-linux-arm-gnueabihf": "19.5.4", + "@nx/nx-linux-arm64-gnu": "19.5.4", + "@nx/nx-linux-arm64-musl": "19.5.4", + "@nx/nx-linux-x64-gnu": "19.5.4", + "@nx/nx-linux-x64-musl": "19.5.4", + "@nx/nx-win32-arm64-msvc": "19.5.4", + "@nx/nx-win32-x64-msvc": "19.5.4" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -8089,12 +8491,11 @@ } } }, - "node_modules/@nrwl/devkit/node_modules/open": { + "node_modules/@nrwl/jest/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "license": "MIT", - "peer": true, "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -8107,12 +8508,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/devkit/node_modules/ora": { + "node_modules/@nrwl/jest/node_modules/ora": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.0.3", "chalk": "^4.1.0", @@ -8130,12 +8530,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/devkit/node_modules/readable-stream": { + "node_modules/@nrwl/jest/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/jest/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8145,12 +8553,20 @@ "node": ">= 6" } }, - "node_modules/@nrwl/devkit/node_modules/restore-cursor": { + "node_modules/@nrwl/jest/node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/jest/node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -8159,19 +8575,36 @@ "node": ">=8" } }, - "node_modules/@nrwl/devkit/node_modules/signal-exit": { + "node_modules/@nrwl/jest/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true + "license": "ISC" + }, + "node_modules/@nrwl/jest/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nrwl/jest/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "node_modules/@nrwl/devkit/node_modules/string-width": { + "node_modules/@nrwl/jest/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8181,12 +8614,11 @@ "node": ">=8" } }, - "node_modules/@nrwl/devkit/node_modules/tar-stream": { + "node_modules/@nrwl/jest/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -8198,12 +8630,29 @@ "node": ">=6" } }, - "node_modules/@nrwl/devkit/node_modules/yargs": { + "node_modules/@nrwl/jest/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/jest/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nrwl/jest/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8217,16 +8666,16 @@ "node": ">=12" } }, - "node_modules/@nrwl/jest": { + "node_modules/@nrwl/js": { "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-19.5.4.tgz", - "integrity": "sha512-dlu7LBtD4RYavMZ0sBz9NqkYc1YbMYDM/637xDWRdZV17tG7214ATyA0YgVb15UisTkWQpns2tLBXQ/UbkJvFA==", + "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-19.5.4.tgz", + "integrity": "sha512-LIhqrS8hSvVkZp5Qu0Cu0oiNaZjKPOpx9cDn0YKT+XmELdhjywZjcNBv8m9jE27wMX5ritVoVGiPLGUnpQlQmw==", "license": "MIT", "dependencies": { - "@nx/jest": "19.5.4" + "@nx/js": "19.5.4" } }, - "node_modules/@nrwl/jest/node_modules/@napi-rs/wasm-runtime": { + "node_modules/@nrwl/js/node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", @@ -8237,7 +8686,7 @@ "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@nrwl/jest/node_modules/@nx/devkit": { + "node_modules/@nrwl/js/node_modules/@nx/devkit": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.4.tgz", "integrity": "sha512-0TG2iU0xVRuElLP2aLeRSKUynsC+UgHqE/FJW2IcglHngs2/Duw2A4HDUVVOxztkEQPmp736qkYSwFO0nlOGxg==", @@ -8257,39 +8706,7 @@ "nx": ">= 17 <= 20" } }, - "node_modules/@nrwl/jest/node_modules/@nx/jest": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-19.5.4.tgz", - "integrity": "sha512-u05B4j5pfGs+lnRrlpW6s2xECSkBOileroTITUp8xl0/GQnFyBAgFolu2iqH9M/e4+gykzMEsHyK/eZrPUt20A==", - "license": "MIT", - "dependencies": { - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@nrwl/jest": "19.5.4", - "@nx/devkit": "19.5.4", - "@nx/js": "19.5.4", - "@phenomnomnominal/tsquery": "~5.0.1", - "chalk": "^4.1.0", - "identity-obj-proxy": "3.0.0", - "jest-config": "^29.4.1", - "jest-resolve": "^29.4.1", - "jest-util": "^29.4.1", - "minimatch": "9.0.3", - "resolve.exports": "1.1.0", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/jest/node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/js": { + "node_modules/@nrwl/js/node_modules/@nx/js": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/js/-/js-19.5.4.tgz", "integrity": "sha512-PkilOEL/JyQrZjTeuPc1Z+LfJ3kr6/Lxas/hzAjENh2mleNjaDgDVP4/2KxvHexP09wu6BARNDdsK1sXMhpPyA==", @@ -8334,192 +8751,7 @@ } } }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", - "integrity": "sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-darwin-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz", - "integrity": "sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz", - "integrity": "sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz", - "integrity": "sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz", - "integrity": "sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz", - "integrity": "sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz", - "integrity": "sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz", - "integrity": "sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz", - "integrity": "sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz", - "integrity": "sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.4.tgz", - "integrity": "sha512-GI3uMJYwPxjPGHA0UuXZtIqf/fgiCDq63Ns7zpdzwaeOvQbtHySFVV6zclXx/3dXjJsBpEiOYNKPGf17jqx6Dw==", - "license": "MIT", - "dependencies": { - "@nrwl/workspace": "19.5.4", - "@nx/devkit": "19.5.4", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "19.5.4", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-darwin-arm64": { + "node_modules/@nrwl/js/node_modules/@nx/nx-darwin-arm64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.4.tgz", "integrity": "sha512-s+OmSsYUtECmEKAdzSsYoO9vamx+njiP72eSZusmTh7fCJg+dW3dcifRkUf3h1dcM53hffXcmxKEoWxZMAeuXw==", @@ -8535,7 +8767,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-darwin-x64": { + "node_modules/@nrwl/js/node_modules/@nx/nx-darwin-x64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.5.4.tgz", "integrity": "sha512-GjA6aThF9P7FR3OdNZn4g9c1bJeQMOdQmo2jaBaGmUPnOIZSEWinHkvh5g8vDg+jNwRdHKK84jJWWW0/o73iYQ==", @@ -8551,7 +8783,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-freebsd-x64": { + "node_modules/@nrwl/js/node_modules/@nx/nx-freebsd-x64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.5.4.tgz", "integrity": "sha512-KPVTmg2NpvON3+sh2pNWv2GJow5CL3fX2xBo4cI9D50DDZOD4fB68S2v5q6nLC1QWOwQcC0PLnSpoKaDB0PgQg==", @@ -8567,7 +8799,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm-gnueabihf": { + "node_modules/@nrwl/js/node_modules/@nx/nx-linux-arm-gnueabihf": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.5.4.tgz", "integrity": "sha512-a535HwxVhTS+ngcoFxrsqmggpsKWquubILZhIeY/q+XW6nX61FEb/EqlMkc+aJLHD1LQBGax1W+j7YvTA/66Lw==", @@ -8583,7 +8815,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-gnu": { + "node_modules/@nrwl/js/node_modules/@nx/nx-linux-arm64-gnu": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.5.4.tgz", "integrity": "sha512-eRu/IoPB68MQeEmfyub+P79eDYvXOyNa706rp0JnDHL5LMw12kPF3MIeqc/v7o6xWakGHCSnTCulcqsl8HXryg==", @@ -8599,7 +8831,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-musl": { + "node_modules/@nrwl/js/node_modules/@nx/nx-linux-arm64-musl": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.5.4.tgz", "integrity": "sha512-r5NNVngNwTe+zpUAAZAgCezDkjc0pi2zrr8VwiaRZsmVjhHtvvsXJgo1ONw5s2HjKoKuTFEa5jKTUlAHkaQ7Kg==", @@ -8615,7 +8847,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-gnu": { + "node_modules/@nrwl/js/node_modules/@nx/nx-linux-x64-gnu": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.5.4.tgz", "integrity": "sha512-8TWwjyp/bK2a/CHK2HuC7I8iITC9ytEvfru8/kw1mSyoK4kSDlzkL/1uDl536ULXLWORulfEzaGb61GynVc1vg==", @@ -8631,7 +8863,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-musl": { + "node_modules/@nrwl/js/node_modules/@nx/nx-linux-x64-musl": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.5.4.tgz", "integrity": "sha512-5Pf32iv9nnmSV/oOHd9k/5L45m3BooSj096G/ejAN3BHMr4CZIMhjDcQq9ZX7pAZFchU5zL0+dNClK70QfA7PA==", @@ -8647,7 +8879,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-win32-arm64-msvc": { + "node_modules/@nrwl/js/node_modules/@nx/nx-win32-arm64-msvc": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.5.4.tgz", "integrity": "sha512-fyKGfde4Pq9r5qQMLIleujq7B5ta86y8RSPUruoN6zaGrNg6waqbpMdZUjjsg9L7PP9RPaMHPMubC21OnQQomQ==", @@ -8663,7 +8895,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@nx/nx-win32-x64-msvc": { + "node_modules/@nrwl/js/node_modules/@nx/nx-win32-x64-msvc": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.5.4.tgz", "integrity": "sha512-gcAr5zZQKiAxHZ7iUOVeMLf/KIh4EFbF07Q0uSmgGmUJL1u3mZTjeG57V1AMZbTQESGY43rgoymqVYkghc5Jlw==", @@ -8679,92 +8911,22 @@ "node": ">= 10" } }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", - "license": "BSD-2-Clause", - "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/@nrwl/jest/node_modules/@nx/workspace/node_modules/nx": { + "node_modules/@nrwl/js/node_modules/@nx/workspace": { "version": "19.5.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.4.tgz", - "integrity": "sha512-zfxIFe+29Na6GKlmPPzQhCjnBv5HoLaT43mYZdHh3BPrVOzWBCXNwxWROG1ZK9IcUepwySWq7NI/H3w8BGPEGg==", - "hasInstallScript": true, + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.4.tgz", + "integrity": "sha512-GI3uMJYwPxjPGHA0UuXZtIqf/fgiCDq63Ns7zpdzwaeOvQbtHySFVV6zclXx/3dXjJsBpEiOYNKPGf17jqx6Dw==", "license": "MIT", "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.5.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.7.2", + "@nrwl/workspace": "19.5.4", + "@nx/devkit": "19.5.4", "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", + "nx": "19.5.4", "tslib": "^2.3.0", - "yargs": "^17.6.2", "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.5.4", - "@nx/nx-darwin-x64": "19.5.4", - "@nx/nx-freebsd-x64": "19.5.4", - "@nx/nx-linux-arm-gnueabihf": "19.5.4", - "@nx/nx-linux-arm64-gnu": "19.5.4", - "@nx/nx-linux-arm64-musl": "19.5.4", - "@nx/nx-linux-x64-gnu": "19.5.4", - "@nx/nx-linux-x64-musl": "19.5.4", - "@nx/nx-win32-arm64-msvc": "19.5.4", - "@nx/nx-win32-x64-msvc": "19.5.4" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } } }, - "node_modules/@nrwl/jest/node_modules/@tybys/wasm-util": { + "node_modules/@nrwl/js/node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", @@ -8773,7 +8935,20 @@ "tslib": "^2.4.0" } }, - "node_modules/@nrwl/jest/node_modules/babel-plugin-macros": { + "node_modules/@nrwl/js/node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@nrwl/js/node_modules/babel-plugin-macros": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", @@ -8784,23 +8959,7 @@ "resolve": "^1.12.0" } }, - "node_modules/@nrwl/jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nrwl/jest/node_modules/cli-cursor": { + "node_modules/@nrwl/js/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", @@ -8812,7 +8971,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/cosmiconfig": { + "node_modules/@nrwl/js/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", @@ -8828,16 +8987,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nrwl/jest/node_modules/define-lazy-prop": { + "node_modules/@nrwl/js/node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", @@ -8846,13 +8996,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/emoji-regex": { + "node_modules/@nrwl/js/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/@nrwl/jest/node_modules/fast-glob": { + "node_modules/@nrwl/js/node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", @@ -8868,7 +9018,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/fs-extra": { + "node_modules/@nrwl/js/node_modules/fs-extra": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", @@ -8882,7 +9032,7 @@ "node": ">=14.14" } }, - "node_modules/@nrwl/jest/node_modules/glob-parent": { + "node_modules/@nrwl/js/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", @@ -8894,7 +9044,7 @@ "node": ">= 6" } }, - "node_modules/@nrwl/jest/node_modules/hosted-git-info": { + "node_modules/@nrwl/js/node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", @@ -8906,7 +9056,7 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@nrwl/jest/node_modules/is-docker": { + "node_modules/@nrwl/js/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", @@ -8921,7 +9071,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/jest/node_modules/is-fullwidth-code-point": { + "node_modules/@nrwl/js/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", @@ -8930,7 +9080,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/is-interactive": { + "node_modules/@nrwl/js/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", @@ -8939,7 +9089,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/is-unicode-supported": { + "node_modules/@nrwl/js/node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", @@ -8951,7 +9101,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/jest/node_modules/is-wsl": { + "node_modules/@nrwl/js/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", @@ -8963,13 +9113,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/jsonc-parser": { + "node_modules/@nrwl/js/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "license": "MIT" }, - "node_modules/@nrwl/jest/node_modules/log-symbols": { + "node_modules/@nrwl/js/node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", @@ -8985,13 +9135,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/jest/node_modules/lru-cache": { + "node_modules/@nrwl/js/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/@nrwl/jest/node_modules/npm-package-arg": { + "node_modules/@nrwl/js/node_modules/npm-package-arg": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", @@ -9006,19 +9156,19 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@nrwl/jest/node_modules/nx": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.2.tgz", - "integrity": "sha512-mDKpbH3vEpUFDx0rrLh+tTqLq1PYU8KiD/R7OVZGd1FxQxghx2HOl32MiqNsfPcw6AvKlXhslbwIESV+N55FLQ==", + "node_modules/@nrwl/js/node_modules/nx": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.4.tgz", + "integrity": "sha512-zfxIFe+29Na6GKlmPPzQhCjnBv5HoLaT43mYZdHh3BPrVOzWBCXNwxWROG1ZK9IcUepwySWq7NI/H3w8BGPEGg==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.5.4", "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", + "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", + "axios": "^1.7.2", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -9029,23 +9179,23 @@ "figures": "3.2.0", "flat": "^5.0.2", "front-matter": "^4.0.2", + "fs-extra": "^11.1.0", "ignore": "^5.0.4", "jest-diff": "^29.4.1", "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", + "lines-and-columns": "~2.0.3", "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", "open": "^8.4.0", "ora": "5.3.0", - "resolve.exports": "2.0.3", "semver": "^7.5.3", "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", - "yaml": "^2.6.0", "yargs": "^17.6.2", "yargs-parser": "21.1.1" }, @@ -9054,16 +9204,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.2", - "@nx/nx-darwin-x64": "20.8.2", - "@nx/nx-freebsd-x64": "20.8.2", - "@nx/nx-linux-arm-gnueabihf": "20.8.2", - "@nx/nx-linux-arm64-gnu": "20.8.2", - "@nx/nx-linux-arm64-musl": "20.8.2", - "@nx/nx-linux-x64-gnu": "20.8.2", - "@nx/nx-linux-x64-musl": "20.8.2", - "@nx/nx-win32-arm64-msvc": "20.8.2", - "@nx/nx-win32-x64-msvc": "20.8.2" + "@nx/nx-darwin-arm64": "19.5.4", + "@nx/nx-darwin-x64": "19.5.4", + "@nx/nx-freebsd-x64": "19.5.4", + "@nx/nx-linux-arm-gnueabihf": "19.5.4", + "@nx/nx-linux-arm64-gnu": "19.5.4", + "@nx/nx-linux-arm64-musl": "19.5.4", + "@nx/nx-linux-x64-gnu": "19.5.4", + "@nx/nx-linux-x64-musl": "19.5.4", + "@nx/nx-win32-arm64-msvc": "19.5.4", + "@nx/nx-win32-x64-msvc": "19.5.4" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -9078,7 +9228,7 @@ } } }, - "node_modules/@nrwl/jest/node_modules/open": { + "node_modules/@nrwl/js/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", @@ -9095,7 +9245,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/jest/node_modules/ora": { + "node_modules/@nrwl/js/node_modules/ora": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", @@ -9117,7 +9267,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/jest/node_modules/proc-log": { + "node_modules/@nrwl/js/node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", @@ -9126,7 +9276,7 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@nrwl/jest/node_modules/readable-stream": { + "node_modules/@nrwl/js/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", @@ -9140,7 +9290,7 @@ "node": ">= 6" } }, - "node_modules/@nrwl/jest/node_modules/restore-cursor": { + "node_modules/@nrwl/js/node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", @@ -9153,13 +9303,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/signal-exit": { + "node_modules/@nrwl/js/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/@nrwl/jest/node_modules/source-map": { + "node_modules/@nrwl/js/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", @@ -9168,7 +9318,7 @@ "node": ">=0.10.0" } }, - "node_modules/@nrwl/jest/node_modules/source-map-support": { + "node_modules/@nrwl/js/node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", @@ -9178,7 +9328,7 @@ "source-map": "^0.6.0" } }, - "node_modules/@nrwl/jest/node_modules/string-width": { + "node_modules/@nrwl/js/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -9192,7 +9342,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/jest/node_modules/tar-stream": { + "node_modules/@nrwl/js/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", @@ -9208,7 +9358,7 @@ "node": ">=6" } }, - "node_modules/@nrwl/jest/node_modules/validate-npm-package-name": { + "node_modules/@nrwl/js/node_modules/validate-npm-package-name": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", @@ -9217,7 +9367,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@nrwl/jest/node_modules/yargs": { + "node_modules/@nrwl/js/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nrwl/js/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", @@ -9235,16 +9394,20 @@ "node": ">=12" } }, - "node_modules/@nrwl/js": { + "node_modules/@nrwl/tao": { "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-19.5.4.tgz", - "integrity": "sha512-LIhqrS8hSvVkZp5Qu0Cu0oiNaZjKPOpx9cDn0YKT+XmELdhjywZjcNBv8m9jE27wMX5ritVoVGiPLGUnpQlQmw==", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.5.4.tgz", + "integrity": "sha512-LNCi+2Rb17wNkUUdX2OQPRv9qOrstlmuAAA9VVcIcW78NdybjgWWvMIhf4NrAkjn7/uALrZdv22zyiGekmheDw==", "license": "MIT", "dependencies": { - "@nx/js": "19.5.4" + "nx": "19.5.4", + "tslib": "^2.3.0" + }, + "bin": { + "tao": "index.js" } }, - "node_modules/@nrwl/js/node_modules/@napi-rs/wasm-runtime": { + "node_modules/@nrwl/tao/node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", @@ -9255,263 +9418,13 @@ "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@nrwl/js/node_modules/@nx/devkit": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-darwin-arm64": { "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.4.tgz", - "integrity": "sha512-0TG2iU0xVRuElLP2aLeRSKUynsC+UgHqE/FJW2IcglHngs2/Duw2A4HDUVVOxztkEQPmp736qkYSwFO0nlOGxg==", - "license": "MIT", - "dependencies": { - "@nrwl/devkit": "19.5.4", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 17 <= 20" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/js": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-19.5.4.tgz", - "integrity": "sha512-PkilOEL/JyQrZjTeuPc1Z+LfJ3kr6/Lxas/hzAjENh2mleNjaDgDVP4/2KxvHexP09wu6BARNDdsK1sXMhpPyA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nrwl/js": "19.5.4", - "@nx/devkit": "19.5.4", - "@nx/workspace": "19.5.4", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "minimatch": "9.0.3", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "ts-node": "10.9.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^5.0.4" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", - "integrity": "sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-darwin-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz", - "integrity": "sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz", - "integrity": "sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz", - "integrity": "sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz", - "integrity": "sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz", - "integrity": "sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz", - "integrity": "sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz", - "integrity": "sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz", - "integrity": "sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz", - "integrity": "sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/workspace": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.4.tgz", - "integrity": "sha512-GI3uMJYwPxjPGHA0UuXZtIqf/fgiCDq63Ns7zpdzwaeOvQbtHySFVV6zclXx/3dXjJsBpEiOYNKPGf17jqx6Dw==", - "license": "MIT", - "dependencies": { - "@nrwl/workspace": "19.5.4", - "@nx/devkit": "19.5.4", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "19.5.4", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-darwin-arm64": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.4.tgz", - "integrity": "sha512-s+OmSsYUtECmEKAdzSsYoO9vamx+njiP72eSZusmTh7fCJg+dW3dcifRkUf3h1dcM53hffXcmxKEoWxZMAeuXw==", - "cpu": [ - "arm64" - ], + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.4.tgz", + "integrity": "sha512-s+OmSsYUtECmEKAdzSsYoO9vamx+njiP72eSZusmTh7fCJg+dW3dcifRkUf3h1dcM53hffXcmxKEoWxZMAeuXw==", + "cpu": [ + "arm64" + ], "license": "MIT", "optional": true, "os": [ @@ -9521,7 +9434,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-darwin-x64": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-darwin-x64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.5.4.tgz", "integrity": "sha512-GjA6aThF9P7FR3OdNZn4g9c1bJeQMOdQmo2jaBaGmUPnOIZSEWinHkvh5g8vDg+jNwRdHKK84jJWWW0/o73iYQ==", @@ -9537,7 +9450,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-freebsd-x64": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-freebsd-x64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.5.4.tgz", "integrity": "sha512-KPVTmg2NpvON3+sh2pNWv2GJow5CL3fX2xBo4cI9D50DDZOD4fB68S2v5q6nLC1QWOwQcC0PLnSpoKaDB0PgQg==", @@ -9553,7 +9466,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm-gnueabihf": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm-gnueabihf": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.5.4.tgz", "integrity": "sha512-a535HwxVhTS+ngcoFxrsqmggpsKWquubILZhIeY/q+XW6nX61FEb/EqlMkc+aJLHD1LQBGax1W+j7YvTA/66Lw==", @@ -9569,7 +9482,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-gnu": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm64-gnu": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.5.4.tgz", "integrity": "sha512-eRu/IoPB68MQeEmfyub+P79eDYvXOyNa706rp0JnDHL5LMw12kPF3MIeqc/v7o6xWakGHCSnTCulcqsl8HXryg==", @@ -9585,7 +9498,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-musl": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm64-musl": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.5.4.tgz", "integrity": "sha512-r5NNVngNwTe+zpUAAZAgCezDkjc0pi2zrr8VwiaRZsmVjhHtvvsXJgo1ONw5s2HjKoKuTFEa5jKTUlAHkaQ7Kg==", @@ -9601,7 +9514,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-gnu": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-x64-gnu": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.5.4.tgz", "integrity": "sha512-8TWwjyp/bK2a/CHK2HuC7I8iITC9ytEvfru8/kw1mSyoK4kSDlzkL/1uDl536ULXLWORulfEzaGb61GynVc1vg==", @@ -9617,7 +9530,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-musl": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-x64-musl": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.5.4.tgz", "integrity": "sha512-5Pf32iv9nnmSV/oOHd9k/5L45m3BooSj096G/ejAN3BHMr4CZIMhjDcQq9ZX7pAZFchU5zL0+dNClK70QfA7PA==", @@ -9633,7 +9546,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-win32-arm64-msvc": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-win32-arm64-msvc": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.5.4.tgz", "integrity": "sha512-fyKGfde4Pq9r5qQMLIleujq7B5ta86y8RSPUruoN6zaGrNg6waqbpMdZUjjsg9L7PP9RPaMHPMubC21OnQQomQ==", @@ -9649,7 +9562,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@nx/nx-win32-x64-msvc": { + "node_modules/@nrwl/tao/node_modules/@nx/nx-win32-x64-msvc": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.5.4.tgz", "integrity": "sha512-gcAr5zZQKiAxHZ7iUOVeMLf/KIh4EFbF07Q0uSmgGmUJL1u3mZTjeG57V1AMZbTQESGY43rgoymqVYkghc5Jlw==", @@ -9665,92 +9578,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", - "license": "BSD-2-Clause", - "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/@nrwl/js/node_modules/@nx/workspace/node_modules/nx": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.4.tgz", - "integrity": "sha512-zfxIFe+29Na6GKlmPPzQhCjnBv5HoLaT43mYZdHh3BPrVOzWBCXNwxWROG1ZK9IcUepwySWq7NI/H3w8BGPEGg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.5.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.7.2", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.5.4", - "@nx/nx-darwin-x64": "19.5.4", - "@nx/nx-freebsd-x64": "19.5.4", - "@nx/nx-linux-arm-gnueabihf": "19.5.4", - "@nx/nx-linux-arm64-gnu": "19.5.4", - "@nx/nx-linux-arm64-musl": "19.5.4", - "@nx/nx-linux-x64-gnu": "19.5.4", - "@nx/nx-linux-x64-musl": "19.5.4", - "@nx/nx-win32-arm64-msvc": "19.5.4", - "@nx/nx-win32-x64-msvc": "19.5.4" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nrwl/js/node_modules/@tybys/wasm-util": { + "node_modules/@nrwl/tao/node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", @@ -9759,34 +9587,20 @@ "tslib": "^2.4.0" } }, - "node_modules/@nrwl/js/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/@nrwl/js/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", + "node_modules/@nrwl/tao/node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14.15.0" } }, - "node_modules/@nrwl/js/node_modules/cli-cursor": { + "node_modules/@nrwl/tao/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", @@ -9798,32 +9612,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/js/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nrwl/js/node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nrwl/js/node_modules/define-lazy-prop": { + "node_modules/@nrwl/tao/node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", @@ -9832,29 +9621,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/js/node_modules/emoji-regex": { + "node_modules/@nrwl/tao/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/@nrwl/js/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nrwl/js/node_modules/fs-extra": { + "node_modules/@nrwl/tao/node_modules/fs-extra": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", @@ -9868,31 +9641,7 @@ "node": ">=14.14" } }, - "node_modules/@nrwl/js/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nrwl/js/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nrwl/js/node_modules/is-docker": { + "node_modules/@nrwl/tao/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", @@ -9907,7 +9656,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/js/node_modules/is-fullwidth-code-point": { + "node_modules/@nrwl/tao/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", @@ -9916,7 +9665,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/js/node_modules/is-interactive": { + "node_modules/@nrwl/tao/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", @@ -9925,7 +9674,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/js/node_modules/is-unicode-supported": { + "node_modules/@nrwl/tao/node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", @@ -9937,7 +9686,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/js/node_modules/is-wsl": { + "node_modules/@nrwl/tao/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", @@ -9949,13 +9698,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/js/node_modules/jsonc-parser": { + "node_modules/@nrwl/tao/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "license": "MIT" }, - "node_modules/@nrwl/js/node_modules/log-symbols": { + "node_modules/@nrwl/tao/node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", @@ -9971,40 +9720,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/js/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@nrwl/js/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nrwl/js/node_modules/nx": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.2.tgz", - "integrity": "sha512-mDKpbH3vEpUFDx0rrLh+tTqLq1PYU8KiD/R7OVZGd1FxQxghx2HOl32MiqNsfPcw6AvKlXhslbwIESV+N55FLQ==", + "node_modules/@nrwl/tao/node_modules/nx": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.4.tgz", + "integrity": "sha512-zfxIFe+29Na6GKlmPPzQhCjnBv5HoLaT43mYZdHh3BPrVOzWBCXNwxWROG1ZK9IcUepwySWq7NI/H3w8BGPEGg==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.5.4", "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", + "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", + "axios": "^1.7.2", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -10015,23 +9743,23 @@ "figures": "3.2.0", "flat": "^5.0.2", "front-matter": "^4.0.2", + "fs-extra": "^11.1.0", "ignore": "^5.0.4", "jest-diff": "^29.4.1", "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", + "lines-and-columns": "~2.0.3", "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", "open": "^8.4.0", "ora": "5.3.0", - "resolve.exports": "2.0.3", "semver": "^7.5.3", "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", - "yaml": "^2.6.0", "yargs": "^17.6.2", "yargs-parser": "21.1.1" }, @@ -10040,16 +9768,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.2", - "@nx/nx-darwin-x64": "20.8.2", - "@nx/nx-freebsd-x64": "20.8.2", - "@nx/nx-linux-arm-gnueabihf": "20.8.2", - "@nx/nx-linux-arm64-gnu": "20.8.2", - "@nx/nx-linux-arm64-musl": "20.8.2", - "@nx/nx-linux-x64-gnu": "20.8.2", - "@nx/nx-linux-x64-musl": "20.8.2", - "@nx/nx-win32-arm64-msvc": "20.8.2", - "@nx/nx-win32-x64-msvc": "20.8.2" + "@nx/nx-darwin-arm64": "19.5.4", + "@nx/nx-darwin-x64": "19.5.4", + "@nx/nx-freebsd-x64": "19.5.4", + "@nx/nx-linux-arm-gnueabihf": "19.5.4", + "@nx/nx-linux-arm64-gnu": "19.5.4", + "@nx/nx-linux-arm64-musl": "19.5.4", + "@nx/nx-linux-x64-gnu": "19.5.4", + "@nx/nx-linux-x64-musl": "19.5.4", + "@nx/nx-win32-arm64-msvc": "19.5.4", + "@nx/nx-win32-x64-msvc": "19.5.4" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -10064,7 +9792,7 @@ } } }, - "node_modules/@nrwl/js/node_modules/open": { + "node_modules/@nrwl/tao/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", @@ -10081,7 +9809,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/js/node_modules/ora": { + "node_modules/@nrwl/tao/node_modules/ora": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", @@ -10103,16 +9831,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/js/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nrwl/js/node_modules/readable-stream": { + "node_modules/@nrwl/tao/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", @@ -10126,7 +9845,7 @@ "node": ">= 6" } }, - "node_modules/@nrwl/js/node_modules/restore-cursor": { + "node_modules/@nrwl/tao/node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", @@ -10139,32 +9858,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/js/node_modules/signal-exit": { + "node_modules/@nrwl/tao/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/@nrwl/js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nrwl/js/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@nrwl/js/node_modules/string-width": { + "node_modules/@nrwl/tao/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -10178,7 +9878,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/js/node_modules/tar-stream": { + "node_modules/@nrwl/tao/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", @@ -10194,16 +9894,7 @@ "node": ">=6" } }, - "node_modules/@nrwl/js/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nrwl/js/node_modules/yargs": { + "node_modules/@nrwl/tao/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", @@ -10221,20 +9912,16 @@ "node": ">=12" } }, - "node_modules/@nrwl/tao": { + "node_modules/@nrwl/workspace": { "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.5.4.tgz", - "integrity": "sha512-LNCi+2Rb17wNkUUdX2OQPRv9qOrstlmuAAA9VVcIcW78NdybjgWWvMIhf4NrAkjn7/uALrZdv22zyiGekmheDw==", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-19.5.4.tgz", + "integrity": "sha512-0vrhaotIhuNbP5qeKBC0xC9sEZfpPfUG27lf/mVWdkRCreJXFrIJL+R74care9gnDr9ZFR8a1LalYB1JuG5QWA==", "license": "MIT", "dependencies": { - "nx": "19.5.4", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" + "@nx/workspace": "19.5.4" } }, - "node_modules/@nrwl/tao/node_modules/@napi-rs/wasm-runtime": { + "node_modules/@nrwl/workspace/node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", @@ -10245,7 +9932,27 @@ "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-darwin-arm64": { + "node_modules/@nrwl/workspace/node_modules/@nx/devkit": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.4.tgz", + "integrity": "sha512-0TG2iU0xVRuElLP2aLeRSKUynsC+UgHqE/FJW2IcglHngs2/Duw2A4HDUVVOxztkEQPmp736qkYSwFO0nlOGxg==", + "license": "MIT", + "dependencies": { + "@nrwl/devkit": "19.5.4", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 17 <= 20" + } + }, + "node_modules/@nrwl/workspace/node_modules/@nx/nx-darwin-arm64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.4.tgz", "integrity": "sha512-s+OmSsYUtECmEKAdzSsYoO9vamx+njiP72eSZusmTh7fCJg+dW3dcifRkUf3h1dcM53hffXcmxKEoWxZMAeuXw==", @@ -10261,7 +9968,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-darwin-x64": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-darwin-x64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.5.4.tgz", "integrity": "sha512-GjA6aThF9P7FR3OdNZn4g9c1bJeQMOdQmo2jaBaGmUPnOIZSEWinHkvh5g8vDg+jNwRdHKK84jJWWW0/o73iYQ==", @@ -10277,7 +9984,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-freebsd-x64": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-freebsd-x64": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.5.4.tgz", "integrity": "sha512-KPVTmg2NpvON3+sh2pNWv2GJow5CL3fX2xBo4cI9D50DDZOD4fB68S2v5q6nLC1QWOwQcC0PLnSpoKaDB0PgQg==", @@ -10293,7 +10000,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm-gnueabihf": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-arm-gnueabihf": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.5.4.tgz", "integrity": "sha512-a535HwxVhTS+ngcoFxrsqmggpsKWquubILZhIeY/q+XW6nX61FEb/EqlMkc+aJLHD1LQBGax1W+j7YvTA/66Lw==", @@ -10309,7 +10016,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm64-gnu": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-arm64-gnu": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.5.4.tgz", "integrity": "sha512-eRu/IoPB68MQeEmfyub+P79eDYvXOyNa706rp0JnDHL5LMw12kPF3MIeqc/v7o6xWakGHCSnTCulcqsl8HXryg==", @@ -10325,7 +10032,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm64-musl": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-arm64-musl": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.5.4.tgz", "integrity": "sha512-r5NNVngNwTe+zpUAAZAgCezDkjc0pi2zrr8VwiaRZsmVjhHtvvsXJgo1ONw5s2HjKoKuTFEa5jKTUlAHkaQ7Kg==", @@ -10341,7 +10048,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-x64-gnu": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-x64-gnu": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.5.4.tgz", "integrity": "sha512-8TWwjyp/bK2a/CHK2HuC7I8iITC9ytEvfru8/kw1mSyoK4kSDlzkL/1uDl536ULXLWORulfEzaGb61GynVc1vg==", @@ -10357,7 +10064,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-x64-musl": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-x64-musl": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.5.4.tgz", "integrity": "sha512-5Pf32iv9nnmSV/oOHd9k/5L45m3BooSj096G/ejAN3BHMr4CZIMhjDcQq9ZX7pAZFchU5zL0+dNClK70QfA7PA==", @@ -10373,7 +10080,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-win32-arm64-msvc": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-win32-arm64-msvc": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.5.4.tgz", "integrity": "sha512-fyKGfde4Pq9r5qQMLIleujq7B5ta86y8RSPUruoN6zaGrNg6waqbpMdZUjjsg9L7PP9RPaMHPMubC21OnQQomQ==", @@ -10389,7 +10096,7 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@nx/nx-win32-x64-msvc": { + "node_modules/@nrwl/workspace/node_modules/@nx/nx-win32-x64-msvc": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.5.4.tgz", "integrity": "sha512-gcAr5zZQKiAxHZ7iUOVeMLf/KIh4EFbF07Q0uSmgGmUJL1u3mZTjeG57V1AMZbTQESGY43rgoymqVYkghc5Jlw==", @@ -10405,7 +10112,22 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao/node_modules/@tybys/wasm-util": { + "node_modules/@nrwl/workspace/node_modules/@nx/workspace": { + "version": "19.5.4", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.4.tgz", + "integrity": "sha512-GI3uMJYwPxjPGHA0UuXZtIqf/fgiCDq63Ns7zpdzwaeOvQbtHySFVV6zclXx/3dXjJsBpEiOYNKPGf17jqx6Dw==", + "license": "MIT", + "dependencies": { + "@nrwl/workspace": "19.5.4", + "@nx/devkit": "19.5.4", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "19.5.4", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nrwl/workspace/node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", @@ -10414,7 +10136,7 @@ "tslib": "^2.4.0" } }, - "node_modules/@nrwl/tao/node_modules/@yarnpkg/parsers": { + "node_modules/@nrwl/workspace/node_modules/@yarnpkg/parsers": { "version": "3.0.0-rc.46", "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", @@ -10427,23 +10149,7 @@ "node": ">=14.15.0" } }, - "node_modules/@nrwl/tao/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nrwl/tao/node_modules/cli-cursor": { + "node_modules/@nrwl/workspace/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", @@ -10455,7 +10161,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/tao/node_modules/define-lazy-prop": { + "node_modules/@nrwl/workspace/node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", @@ -10464,13 +10170,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/tao/node_modules/emoji-regex": { + "node_modules/@nrwl/workspace/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/@nrwl/tao/node_modules/fs-extra": { + "node_modules/@nrwl/workspace/node_modules/fs-extra": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", @@ -10484,7 +10190,7 @@ "node": ">=14.14" } }, - "node_modules/@nrwl/tao/node_modules/is-docker": { + "node_modules/@nrwl/workspace/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", @@ -10499,7 +10205,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/tao/node_modules/is-fullwidth-code-point": { + "node_modules/@nrwl/workspace/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", @@ -10508,7 +10214,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/tao/node_modules/is-interactive": { + "node_modules/@nrwl/workspace/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", @@ -10517,7 +10223,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/tao/node_modules/is-unicode-supported": { + "node_modules/@nrwl/workspace/node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", @@ -10529,7 +10235,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/tao/node_modules/is-wsl": { + "node_modules/@nrwl/workspace/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", @@ -10541,13 +10247,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/tao/node_modules/jsonc-parser": { + "node_modules/@nrwl/workspace/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "license": "MIT" }, - "node_modules/@nrwl/tao/node_modules/log-symbols": { + "node_modules/@nrwl/workspace/node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", @@ -10563,7 +10269,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/tao/node_modules/nx": { + "node_modules/@nrwl/workspace/node_modules/nx": { "version": "19.5.4", "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.4.tgz", "integrity": "sha512-zfxIFe+29Na6GKlmPPzQhCjnBv5HoLaT43mYZdHh3BPrVOzWBCXNwxWROG1ZK9IcUepwySWq7NI/H3w8BGPEGg==", @@ -10635,7 +10341,7 @@ } } }, - "node_modules/@nrwl/tao/node_modules/open": { + "node_modules/@nrwl/workspace/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", @@ -10652,7 +10358,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/tao/node_modules/ora": { + "node_modules/@nrwl/workspace/node_modules/ora": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", @@ -10674,7 +10380,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/tao/node_modules/readable-stream": { + "node_modules/@nrwl/workspace/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", @@ -10688,7 +10394,7 @@ "node": ">= 6" } }, - "node_modules/@nrwl/tao/node_modules/restore-cursor": { + "node_modules/@nrwl/workspace/node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", @@ -10701,13 +10407,13 @@ "node": ">=8" } }, - "node_modules/@nrwl/tao/node_modules/signal-exit": { + "node_modules/@nrwl/workspace/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/@nrwl/tao/node_modules/string-width": { + "node_modules/@nrwl/workspace/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -10721,7 +10427,7 @@ "node": ">=8" } }, - "node_modules/@nrwl/tao/node_modules/tar-stream": { + "node_modules/@nrwl/workspace/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", @@ -10737,7 +10443,7 @@ "node": ">=6" } }, - "node_modules/@nrwl/tao/node_modules/yargs": { + "node_modules/@nrwl/workspace/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", @@ -10755,1221 +10461,1188 @@ "node": ">=12" } }, - "node_modules/@nrwl/workspace": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-19.5.4.tgz", - "integrity": "sha512-0vrhaotIhuNbP5qeKBC0xC9sEZfpPfUG27lf/mVWdkRCreJXFrIJL+R74care9gnDr9ZFR8a1LalYB1JuG5QWA==", + "node_modules/@nx/angular": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-22.3.3.tgz", + "integrity": "sha512-XE1grDPwpHySUSDMjgzgyjk/k6WjwooBXl19uilUR4solAPzlrz46qdyjzAPpEhvNAk0YsXflewgPebyuX5P2w==", + "dev": true, "license": "MIT", "dependencies": { - "@nx/workspace": "19.5.4" + "@nx/devkit": "22.3.3", + "@nx/eslint": "22.3.3", + "@nx/js": "22.3.3", + "@nx/module-federation": "22.3.3", + "@nx/rspack": "22.3.3", + "@nx/web": "22.3.3", + "@nx/webpack": "22.3.3", + "@nx/workspace": "22.3.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@typescript-eslint/type-utils": "^8.0.0", + "enquirer": "~2.3.6", + "magic-string": "~0.30.2", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">= 19.0.0 < 22.0.0", + "@angular-devkit/core": ">= 19.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 19.0.0 < 22.0.0", + "@angular/build": ">= 19.0.0 < 22.0.0", + "@schematics/angular": ">= 19.0.0 < 22.0.0", + "ng-packagr": ">= 19.0.0 < 22.0.0", + "rxjs": "^6.5.3 || ^7.5.0" + }, + "peerDependenciesMeta": { + "@angular-devkit/build-angular": { + "optional": true + }, + "@angular/build": { + "optional": true + }, + "ng-packagr": { + "optional": true + } } }, - "node_modules/@nrwl/workspace/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "node_modules/@nx/angular/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/angular/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, "license": "MIT", "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/devkit": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.4.tgz", - "integrity": "sha512-0TG2iU0xVRuElLP2aLeRSKUynsC+UgHqE/FJW2IcglHngs2/Duw2A4HDUVVOxztkEQPmp736qkYSwFO0nlOGxg==", + "node_modules/@nx/devkit": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.3.3.tgz", + "integrity": "sha512-/hxcdhE+QDalsWEbJurHtZh9aY27taHeImbCVJnogwv85H3RbAE+0YuKXGInutfLszAs7phwzli71yq+d2P45Q==", + "dev": true, "license": "MIT", "dependencies": { - "@nrwl/devkit": "19.5.4", + "@zkochan/js-yaml": "0.0.7", "ejs": "^3.1.7", "enquirer": "~2.3.6", - "ignore": "^5.0.4", "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", + "semver": "^7.6.3", "tslib": "^2.3.0", "yargs-parser": "21.1.1" }, "peerDependencies": { - "nx": ">= 17 <= 20" + "nx": ">= 21 <= 23 || ^22.0.0-0" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-darwin-arm64": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.4.tgz", - "integrity": "sha512-s+OmSsYUtECmEKAdzSsYoO9vamx+njiP72eSZusmTh7fCJg+dW3dcifRkUf3h1dcM53hffXcmxKEoWxZMAeuXw==", - "cpu": [ - "arm64" - ], + "node_modules/@nx/eslint": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-22.3.3.tgz", + "integrity": "sha512-iG/LvrYf2CFAm2A0kfmRU4VeCTAN5PjUw8xc6oD1zfQ/KTmE/gFG2P1aJBo2mTIyzk9k8ZI0dqIhPLdl/AAtxg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "typescript": "~5.9.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-darwin-x64": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.5.4.tgz", - "integrity": "sha512-GjA6aThF9P7FR3OdNZn4g9c1bJeQMOdQmo2jaBaGmUPnOIZSEWinHkvh5g8vDg+jNwRdHKK84jJWWW0/o73iYQ==", - "cpu": [ - "x64" - ], + "node_modules/@nx/eslint-plugin": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-22.3.3.tgz", + "integrity": "sha512-UGAqvYUlKGupBUsO9ppEzYkai1VrrFrUkzHPOVUu5JM4zYGN30ruoO+j3K5OXu5jQLGCmOVfAQD3jzqT2balmw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@typescript-eslint/type-utils": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "globals": "^15.9.0", + "jsonc-eslint-parser": "^2.1.0", + "semver": "^7.6.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", + "eslint-config-prettier": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-freebsd-x64": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.5.4.tgz", - "integrity": "sha512-KPVTmg2NpvON3+sh2pNWv2GJow5CL3fX2xBo4cI9D50DDZOD4fB68S2v5q6nLC1QWOwQcC0PLnSpoKaDB0PgQg==", - "cpu": [ - "x64" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", + "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0" + }, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.5.4.tgz", - "integrity": "sha512-a535HwxVhTS+ngcoFxrsqmggpsKWquubILZhIeY/q+XW6nX61FEb/EqlMkc+aJLHD1LQBGax1W+j7YvTA/66Lw==", - "cpu": [ - "arm" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", + "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.5.4.tgz", - "integrity": "sha512-eRu/IoPB68MQeEmfyub+P79eDYvXOyNa706rp0JnDHL5LMw12kPF3MIeqc/v7o6xWakGHCSnTCulcqsl8HXryg==", - "cpu": [ - "arm64" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", + "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@typescript-eslint/project-service": "8.47.0", + "@typescript-eslint/tsconfig-utils": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-arm64-musl": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.5.4.tgz", - "integrity": "sha512-r5NNVngNwTe+zpUAAZAgCezDkjc0pi2zrr8VwiaRZsmVjhHtvvsXJgo1ONw5s2HjKoKuTFEa5jKTUlAHkaQ7Kg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">= 10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-x64-gnu": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.5.4.tgz", - "integrity": "sha512-8TWwjyp/bK2a/CHK2HuC7I8iITC9ytEvfru8/kw1mSyoK4kSDlzkL/1uDl536ULXLWORulfEzaGb61GynVc1vg==", - "cpu": [ - "x64" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", + "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0" + }, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-linux-x64-musl": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.5.4.tgz", - "integrity": "sha512-5Pf32iv9nnmSV/oOHd9k/5L45m3BooSj096G/ejAN3BHMr4CZIMhjDcQq9ZX7pAZFchU5zL0+dNClK70QfA7PA==", - "cpu": [ - "x64" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", + "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@typescript-eslint/types": "8.47.0", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.5.4.tgz", - "integrity": "sha512-fyKGfde4Pq9r5qQMLIleujq7B5ta86y8RSPUruoN6zaGrNg6waqbpMdZUjjsg9L7PP9RPaMHPMubC21OnQQomQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@nx/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/nx-win32-x64-msvc": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.5.4.tgz", - "integrity": "sha512-gcAr5zZQKiAxHZ7iUOVeMLf/KIh4EFbF07Q0uSmgGmUJL1u3mZTjeG57V1AMZbTQESGY43rgoymqVYkghc5Jlw==", - "cpu": [ - "x64" - ], + "node_modules/@nx/eslint-plugin/node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/@nrwl/workspace/node_modules/@nx/workspace": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.4.tgz", - "integrity": "sha512-GI3uMJYwPxjPGHA0UuXZtIqf/fgiCDq63Ns7zpdzwaeOvQbtHySFVV6zclXx/3dXjJsBpEiOYNKPGf17jqx6Dw==", + "node_modules/@nx/eslint/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@nx/jest": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-22.3.3.tgz", + "integrity": "sha512-BC+5E6oAM6h9x67UCtpsapfLRTwqVLtoG39f5tVZNVZ4a1spdMh0tPHRPtu2hSlsHHtaYsmTvjz5L+N7UguAtA==", + "dev": true, "license": "MIT", "dependencies": { - "@nrwl/workspace": "19.5.4", - "@nx/devkit": "19.5.4", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "19.5.4", + "@jest/reporters": "^30.0.2", + "@jest/test-result": "^30.0.2", + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "identity-obj-proxy": "3.0.0", + "jest-config": "^30.0.2", + "jest-resolve": "^30.0.2", + "jest-util": "^30.0.2", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.6.3", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } }, - "node_modules/@nrwl/workspace/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "node_modules/@nx/jest/node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", - "license": "BSD-2-Clause", + "node_modules/@nx/jest/node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" }, "engines": { - "node": ">=14.15.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@nx/jest/node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@nx/jest/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "@jest/get-type": "30.1.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/@nx/jest/node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/@nrwl/workspace/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "node_modules/@nx/jest/node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { - "node": ">=14.14" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/@nx/jest/node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@nrwl/workspace/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/@nx/jest/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "node_modules/@nx/jest/node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/@nx/jest/node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/@nx/jest/node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "license": "MIT" + "node_modules/@nx/jest/node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "node_modules/@nrwl/workspace/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/@nx/jest/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@sinclair/typebox": { + "version": "0.34.47", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", + "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@nx/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nrwl/workspace/node_modules/nx": { - "version": "19.5.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.4.tgz", - "integrity": "sha512-zfxIFe+29Na6GKlmPPzQhCjnBv5HoLaT43mYZdHh3BPrVOzWBCXNwxWROG1ZK9IcUepwySWq7NI/H3w8BGPEGg==", - "hasInstallScript": true, + "node_modules/@nx/jest/node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, "license": "MIT", "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.5.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.7.2", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.5.4", - "@nx/nx-darwin-x64": "19.5.4", - "@nx/nx-freebsd-x64": "19.5.4", - "@nx/nx-linux-arm-gnueabihf": "19.5.4", - "@nx/nx-linux-arm64-gnu": "19.5.4", - "@nx/nx-linux-arm64-musl": "19.5.4", - "@nx/nx-linux-x64-gnu": "19.5.4", - "@nx/nx-linux-x64-musl": "19.5.4", - "@nx/nx-win32-arm64-msvc": "19.5.4", - "@nx/nx-win32-x64-msvc": "19.5.4" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, - "node_modules/@nrwl/workspace/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", + "node_modules/@nx/jest/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" }, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/workspace/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "node_modules/@nx/jest/node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "@types/babel__core": "^7.20.5" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@nx/jest/node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { - "node": ">= 6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, - "node_modules/@nrwl/workspace/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/@nx/jest/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, "engines": { "node": ">=8" } }, - "node_modules/@nrwl/workspace/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "node_modules/@nx/jest/node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@nrwl/workspace/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@nx/jest/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nrwl/workspace/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", + "node_modules/@nx/jest/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/@nrwl/workspace/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/@nx/jest/node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": ">=12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-21.5.2.tgz", - "integrity": "sha512-a3HAMGB+3ZFMb41m4KVPnTe+5WeUOE3XYkUu/j3dj2Tue+etX6c/NPqa03P3pAi/pYim2LQU4GpW3ACAYjlj+Q==", + "node_modules/@nx/jest/node_modules/jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/eslint": "21.5.2", - "@nx/js": "21.5.2", - "@nx/module-federation": "21.5.2", - "@nx/rspack": "21.5.2", - "@nx/web": "21.5.2", - "@nx/webpack": "21.5.2", - "@nx/workspace": "21.5.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "@typescript-eslint/type-utils": "^8.0.0", - "enquirer": "~2.3.6", - "magic-string": "~0.30.2", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "webpack-merge": "^5.8.0" + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@angular-devkit/build-angular": ">= 18.0.0 < 21.0.0", - "@angular-devkit/core": ">= 18.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 21.0.0", - "@angular/build": ">= 18.0.0 < 21.0.0", - "@schematics/angular": ">= 18.0.0 < 21.0.0", - "ng-packagr": ">= 18.0.0 < 21.0.0", - "rxjs": "^6.5.3 || ^7.5.0" + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { - "@angular-devkit/build-angular": { + "@types/node": { "optional": true }, - "@angular/build": { + "esbuild-register": { "optional": true }, - "ng-packagr": { + "ts-node": { "optional": true } } }, - "node_modules/@nx/angular/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "node_modules/@nx/jest/node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "node_modules/@nx/jest/node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/@nx/devkit": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.5.2.tgz", - "integrity": "sha512-coNOyRBHeB6XHbEYeJ8bd/vhPqGx1+KhXojEsQv9vN9sgONqgWEUk0p/XnIplIvI0E7M/hm8zheydhZNYC9xSQ==", + "node_modules/@nx/jest/node_modules/jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, - "peerDependencies": { - "nx": ">= 20 <= 22" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/@nx/eslint": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.5.2.tgz", - "integrity": "sha512-IpSgLc5PRWCTiiH2Kue9d/RS8Od6loHyfNbeUrSaJlN2Jq+WoxsGFtjsBHxJyQADu7MmlGZn8XutsbDQ8dbVKw==", + "node_modules/@nx/jest/node_modules/jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "typescript": "~5.9.2" - }, - "peerDependencies": { - "@zkochan/js-yaml": "0.0.7", - "eslint": "^8.0.0 || ^9.0.0" + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" }, - "peerDependenciesMeta": { - "@zkochan/js-yaml": { - "optional": true - } + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/@nx/js": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.5.2.tgz", - "integrity": "sha512-zJDzdN0xY5dTw5fPR+IRVpKnRf/hl2WjyBGM42Jkda6vV9aR/sRkz8evXza781FWZ3o2P/wTZhQRMiO5O1fy4w==", + "node_modules/@nx/jest/node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.5.2", - "@nx/workspace": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" }, - "peerDependencies": { - "verdaccio": "^6.0.5" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } + "optionalDependencies": { + "fsevents": "^2.3.3" } }, - "node_modules/@nx/angular/node_modules/@nx/nx-darwin-arm64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.5.2.tgz", - "integrity": "sha512-PrfZbV2blRHoWLor+xDVwPY/dk46kbsmuTXCZRYlNAwko521Y9dCAJT0UOROic3zoUasQ+TwqsQextIcKCotIA==", - "cpu": [ - "arm64" - ], + "node_modules/@nx/jest/node_modules/jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "node_modules/@nx/angular/node_modules/@nx/nx-darwin-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.5.2.tgz", - "integrity": "sha512-YaLY2Cqbjrl+pDddHV7GFtokn81GLvoqg+i9k0Eiid8B0dDLBZpJ3VQKr4RkTzxBX38UuHbJUwrZc8L9z8vqEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-freebsd-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.5.2.tgz", - "integrity": "sha512-2z/Wd42/KHFyT0zRVxWHlaRBQz12Fd1A0FCGJzuWI8G2meh9tYt4MN96gQ4q/rLQ0fmfFEEECq6pmOfCi8t9Mg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.5.2.tgz", - "integrity": "sha512-lY2O1py8x+l39XAFFuplKlzouPC9K/gERYEB/b5jHGf7PGfNj0BX2MDmUztgTty6kKUnkRele39aSoQqWok0gA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.5.2.tgz", - "integrity": "sha512-gcpkXXPpWaf8wB0FZUaKmk8Jdv+QMHLiOcQuuXYi1X0vbgotVTl/y+dccwG1EZml6V5JIRGtg2YDM61a7Olp1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.5.2.tgz", - "integrity": "sha512-oCSUwT0hORgFJWIGjwl6x4/2mVusw+3YAcSrvDePAXadjPSEMLZlJEE+4HExzqLFFBTxc+ucvyOIk08P4BtNJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.5.2.tgz", - "integrity": "sha512-rgJTQk0iaidxEIMOuRQJS36Sk4+qcpJP0uwymvgyoTpZyBdkX38NHH3D+E6sudPSFWsiVxJpkCzYE4ScSKF8Ew==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.5.2.tgz", - "integrity": "sha512-KeS36526VruYO9HzhFGqhE5tbps7e94DV0b4j5wfPr7V51EfPzvjAiMWllsQDARv67wdbQ80c0Wg516XTlekgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.5.2.tgz", - "integrity": "sha512-jlRTycYKOiSqc0fcqvabOH/HZX9BOG0S8EGsLmqEr2OkJLZc25ByD1n22P486R2n+m8GQwL6pX+L1LPpOPmz0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.5.2.tgz", - "integrity": "sha512-Ur8GPdz52kLS5uE9IQf0wBtGyvQm4Y3M1ZDjRkR+oGf26aVGNTK6C0+kMJPuggR4Z6lurmHYA34ViGi2hHPPpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/angular/node_modules/@nx/web": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.5.2.tgz", - "integrity": "sha512-+3oBFCncou+Pxfieo+lSJazNhwJ7SW5dLQHdBImSiO25RUEQdBEBv9Zg+/qGJNMEWHmNw2a1txVGj1Ka+azx2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", - "picocolors": "^1.1.0", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/angular/node_modules/@nx/workspace": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.5.2.tgz", - "integrity": "sha512-7IDa5xqVwGgZXrFGqyMzZTOq0Okxc0KH6M0mLfHJy1393iEUJjLByfkQ0nDyjsRZsLqo11WMOldapBDwy6MlaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "21.5.2", - "picomatch": "4.0.2", - "semver": "^7.6.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/angular/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/angular/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@nx/angular/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@nx/jest/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@nx/jest/node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/@nx/jest/node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/angular/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/angular/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/angular/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/angular/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "node_modules/@nx/jest/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/@nx/jest/node_modules/jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/@nx/jest/node_modules/jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/jest-diff": { + "node_modules/@nx/jest/node_modules/jest-runtime": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", "chalk": "^4.1.2", - "pretty-format": "30.2.0" + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/angular/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/@nx/jest/node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/angular/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "node_modules/@nx/jest/node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/nx": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.5.2.tgz", - "integrity": "sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==", + "node_modules/@nx/jest/node_modules/jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^30.0.2", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tree-kill": "^1.2.2", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.5.2", - "@nx/nx-darwin-x64": "21.5.2", - "@nx/nx-freebsd-x64": "21.5.2", - "@nx/nx-linux-arm-gnueabihf": "21.5.2", - "@nx/nx-linux-arm64-gnu": "21.5.2", - "@nx/nx-linux-arm64-musl": "21.5.2", - "@nx/nx-linux-x64-gnu": "21.5.2", - "@nx/nx-linux-x64-musl": "21.5.2", - "@nx/nx-win32-arm64-msvc": "21.5.2", - "@nx/nx-win32-x64-msvc": "21.5.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/@nx/jest/node_modules/jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "node_modules/@nx/jest/node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/pretty-format": { + "node_modules/@nx/jest/node_modules/pretty-format": { "version": "30.2.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", @@ -11984,4061 +11657,581 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/angular/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "node_modules/@nx/jest/node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" }, - "node_modules/@nx/angular/node_modules/react-is": { + "node_modules/@nx/jest/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" - }, - "node_modules/@nx/angular/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nx/angular/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/angular/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/angular/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/angular/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@nx/angular/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/angular/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@nx/angular/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@nx/angular/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/angular/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@nx/angular/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nx/devkit": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.2.tgz", - "integrity": "sha512-rr9p2/tZDQivIpuBUpZaFBK6bZ+b5SAjZk75V4tbCUqGW3+5OPuVvBPm+X+7PYwUF6rwSpewxkjWNeGskfCe+Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 19 <= 21" - } - }, - "node_modules/@nx/eslint": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.1.2.tgz", - "integrity": "sha512-Mp8u0RlkhxYtZ47d2ou6t8XIpRy7N/n23OzikqMro4Wt/DK1irGyShSoNIqdGdwalAE5MG1OFXspttXB+y/wOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.1.2", - "@nx/js": "21.1.2", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "typescript": "~5.7.2" - }, - "peerDependencies": { - "@zkochan/js-yaml": "0.0.7", - "eslint": "^8.0.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "@zkochan/js-yaml": { - "optional": true - } - } - }, - "node_modules/@nx/eslint-plugin": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-21.1.2.tgz", - "integrity": "sha512-kwhwe6e8dZ0pf5CYPq4OBck15NEJrfuivCEGRTIDZWu3WDYJIw7OvhfyCdGuoZLeHGoCVRjIU6xV5hOzkD9RSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.1.2", - "@nx/js": "21.1.2", - "@typescript-eslint/type-utils": "^8.0.0", - "@typescript-eslint/utils": "^8.0.0", - "chalk": "^4.1.0", - "confusing-browser-globals": "^1.0.9", - "globals": "^15.9.0", - "jsonc-eslint-parser": "^2.1.0", - "semver": "^7.5.3", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", - "eslint-config-prettier": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@nx/devkit": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", - "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": "21.1.2" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", - "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", - "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", - "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/@nx/eslint/node_modules/@nx/devkit": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", - "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": "21.1.2" - } - }, - "node_modules/@nx/eslint/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@nx/jest": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.1.2.tgz", - "integrity": "sha512-y4VZita9LFb6XajulRIwjMcqHU6/f73C4SNSH6IM5BYmkN68ovICmzTGvoaL7wGTaYrA4Moh/WoKwEwQWKxRPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@nx/devkit": "21.1.2", - "@nx/js": "21.1.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "identity-obj-proxy": "3.0.0", - "jest-config": "^29.4.1", - "jest-resolve": "^29.4.1", - "jest-util": "^29.4.1", - "minimatch": "9.0.3", - "picocolors": "^1.1.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/jest/node_modules/@nx/devkit": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", - "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": "21.1.2" - } - }, - "node_modules/@nx/js": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.1.2.tgz", - "integrity": "sha512-ZF6Zf4Ys+RBvH0GoQHio94C/0N07Px/trAvseMuQ8PKc0tSkXycu/EBc1uAZQvgJThR5o3diAKtIQug77pPYMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.1.2", - "@nx/workspace": "21.1.2", - "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^6.0.5" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } - } - }, - "node_modules/@nx/js/node_modules/@nx/devkit": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", - "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": "21.1.2" - } - }, - "node_modules/@nx/js/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/js/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/js/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/js/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/js/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/js/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/js/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/js/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/js/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/js/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/js/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/js/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/js/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/js/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@nx/js/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/module-federation": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-21.5.2.tgz", - "integrity": "sha512-x04ARDiZaUl/3rH2RSRQlykNZ3LD3/scTdljRunCWRZFWvaXe7IX75Tv+fqRCuOYPrTP6ArxgcRwupgVK/Y2Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/enhanced": "^0.18.0", - "@module-federation/node": "^2.7.11", - "@module-federation/sdk": "^0.18.0", - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "@nx/web": "21.5.2", - "@rspack/core": "^1.3.8", - "express": "^4.21.2", - "http-proxy-middleware": "^3.0.5", - "picocolors": "^1.1.0", - "tslib": "^2.3.0", - "webpack": "^5.101.3" - } - }, - "node_modules/@nx/module-federation/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" - } - }, - "node_modules/@nx/module-federation/node_modules/@nx/devkit": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.5.2.tgz", - "integrity": "sha512-coNOyRBHeB6XHbEYeJ8bd/vhPqGx1+KhXojEsQv9vN9sgONqgWEUk0p/XnIplIvI0E7M/hm8zheydhZNYC9xSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 20 <= 22" - } - }, - "node_modules/@nx/module-federation/node_modules/@nx/js": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.5.2.tgz", - "integrity": "sha512-zJDzdN0xY5dTw5fPR+IRVpKnRf/hl2WjyBGM42Jkda6vV9aR/sRkz8evXza781FWZ3o2P/wTZhQRMiO5O1fy4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.5.2", - "@nx/workspace": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^6.0.5" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } - } - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-darwin-arm64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.5.2.tgz", - "integrity": "sha512-PrfZbV2blRHoWLor+xDVwPY/dk46kbsmuTXCZRYlNAwko521Y9dCAJT0UOROic3zoUasQ+TwqsQextIcKCotIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-darwin-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.5.2.tgz", - "integrity": "sha512-YaLY2Cqbjrl+pDddHV7GFtokn81GLvoqg+i9k0Eiid8B0dDLBZpJ3VQKr4RkTzxBX38UuHbJUwrZc8L9z8vqEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-freebsd-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.5.2.tgz", - "integrity": "sha512-2z/Wd42/KHFyT0zRVxWHlaRBQz12Fd1A0FCGJzuWI8G2meh9tYt4MN96gQ4q/rLQ0fmfFEEECq6pmOfCi8t9Mg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.5.2.tgz", - "integrity": "sha512-lY2O1py8x+l39XAFFuplKlzouPC9K/gERYEB/b5jHGf7PGfNj0BX2MDmUztgTty6kKUnkRele39aSoQqWok0gA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.5.2.tgz", - "integrity": "sha512-gcpkXXPpWaf8wB0FZUaKmk8Jdv+QMHLiOcQuuXYi1X0vbgotVTl/y+dccwG1EZml6V5JIRGtg2YDM61a7Olp1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.5.2.tgz", - "integrity": "sha512-oCSUwT0hORgFJWIGjwl6x4/2mVusw+3YAcSrvDePAXadjPSEMLZlJEE+4HExzqLFFBTxc+ucvyOIk08P4BtNJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.5.2.tgz", - "integrity": "sha512-rgJTQk0iaidxEIMOuRQJS36Sk4+qcpJP0uwymvgyoTpZyBdkX38NHH3D+E6sudPSFWsiVxJpkCzYE4ScSKF8Ew==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.5.2.tgz", - "integrity": "sha512-KeS36526VruYO9HzhFGqhE5tbps7e94DV0b4j5wfPr7V51EfPzvjAiMWllsQDARv67wdbQ80c0Wg516XTlekgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.5.2.tgz", - "integrity": "sha512-jlRTycYKOiSqc0fcqvabOH/HZX9BOG0S8EGsLmqEr2OkJLZc25ByD1n22P486R2n+m8GQwL6pX+L1LPpOPmz0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.5.2.tgz", - "integrity": "sha512-Ur8GPdz52kLS5uE9IQf0wBtGyvQm4Y3M1ZDjRkR+oGf26aVGNTK6C0+kMJPuggR4Z6lurmHYA34ViGi2hHPPpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/module-federation/node_modules/@nx/web": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.5.2.tgz", - "integrity": "sha512-+3oBFCncou+Pxfieo+lSJazNhwJ7SW5dLQHdBImSiO25RUEQdBEBv9Zg+/qGJNMEWHmNw2a1txVGj1Ka+azx2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", - "picocolors": "^1.1.0", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/module-federation/node_modules/@nx/workspace": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.5.2.tgz", - "integrity": "sha512-7IDa5xqVwGgZXrFGqyMzZTOq0Okxc0KH6M0mLfHJy1393iEUJjLByfkQ0nDyjsRZsLqo11WMOldapBDwy6MlaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "21.5.2", - "picomatch": "4.0.2", - "semver": "^7.6.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/module-federation/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@nx/module-federation/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@nx/module-federation/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/module-federation/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/module-federation/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/module-federation/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@nx/module-federation/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/module-federation/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/module-federation/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/module-federation/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/module-federation/node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/module-federation/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/nx": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.5.2.tgz", - "integrity": "sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^30.0.2", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tree-kill": "^1.2.2", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.5.2", - "@nx/nx-darwin-x64": "21.5.2", - "@nx/nx-freebsd-x64": "21.5.2", - "@nx/nx-linux-arm-gnueabihf": "21.5.2", - "@nx/nx-linux-arm64-gnu": "21.5.2", - "@nx/nx-linux-arm64-musl": "21.5.2", - "@nx/nx-linux-x64-gnu": "21.5.2", - "@nx/nx-linux-x64-musl": "21.5.2", - "@nx/nx-win32-arm64-msvc": "21.5.2", - "@nx/nx-win32-x64-msvc": "21.5.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nx/module-federation/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/module-federation/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nx/module-federation/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nx/module-federation/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/module-federation/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nx/module-federation/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nx/module-federation/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/module-federation/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/module-federation/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@nx/module-federation/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/module-federation/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@nx/module-federation/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/module-federation/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.1.2.tgz", - "integrity": "sha512-9dO32jd+h7SrvQafJph6b7Bsmp2IotTE0w7dAGb4MGBQni3JWCXaxlMMpWUZXWW1pM5uIkFJO5AASW4UOI7w2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/nx-darwin-x64": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.1.2.tgz", - "integrity": "sha512-5sf+4PRVg9pDVgD53NE1hoPz4lC8Ni34UovQsOrZgDvwU5mqPbIhTzVYRDH86i/086AcCvjT5tEt7rEcuRwlKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.1.2.tgz", - "integrity": "sha512-E5HR44fimXlQuAgn/tP9esmvxbzt/92AIl0PBT6L3Juh/xYiXKWhda63H4+UNT8AcLRxVXwfZrGPuGCDs+7y/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.1.2.tgz", - "integrity": "sha512-V4n6DE+r12gwJHFjZs+e2GmWYZdhpgA2DYWbsYWRYb1XQCNUg4vPzt+YFzWZ+K2o91k93EBnlLfrag7CqxUslw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.1.2.tgz", - "integrity": "sha512-NFhsp27O+mS3r7PWLmJgyZy42WQ72c2pTQSpYfhaBbZPTI5DqBHdANa0sEPmV+ON24qkl5CZKvsmhzjsNmyW6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.1.2.tgz", - "integrity": "sha512-BgS9npARwcnw+hoaRsbas6vdBAJRBAj5qSeL57LO8Dva+e/6PYqoNyVJ0BgJ98xPXDpzM/NnpeRsndQGpLyhDw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.1.2.tgz", - "integrity": "sha512-tjBINbymQgxnIlNK/m6B0P5eiGRSHSYPNkFdh3+sra80AP/ymHGLRxxZy702Ga2xg8RVr9zEvuXYHI+QBa1YmA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.1.2.tgz", - "integrity": "sha512-+0V0YAOWMh1wvpQZuayQ7y+sj2MhE3l7z0JMD9SX/4xv9zLOWGv+EiUmN/fGoU/mwsSkH2wTCo6G6quKF1E8jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.1.2.tgz", - "integrity": "sha512-E+ECMQIMJ6R47BMW5YpDyOhTqczvFaL8k24umRkcvlRh3SraczyxBVPkYHDukDp7tCeIszc5EvdWc83C3W8U4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.1.2.tgz", - "integrity": "sha512-J9rNTBOS7Ld6CybU/cou1Fg52AHSYsiwpZISM2RNM0XIoVSDk3Jsvh4OJgS2rvV0Sp/cgDg3ieOMAreekH+TKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/react": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/react/-/react-21.5.2.tgz", - "integrity": "sha512-8xVWmENzSlSBvAusDoXaWRwgDDuImTYPY+jsMl4AD5mqUpr2u+nJ0xJQlnyUejRIs7iPUyHwd78+SEkZO5sCFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/eslint": "21.5.2", - "@nx/js": "21.5.2", - "@nx/module-federation": "21.5.2", - "@nx/rollup": "21.5.2", - "@nx/vite": "21.5.2", - "@nx/web": "21.5.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "@svgr/webpack": "^8.0.1", - "express": "^4.21.2", - "file-loader": "^6.2.0", - "http-proxy-middleware": "^3.0.5", - "minimatch": "9.0.3", - "picocolors": "^1.1.0", - "semver": "^7.6.3", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/react/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/react/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" - } - }, - "node_modules/@nx/react/node_modules/@nx/devkit": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.5.2.tgz", - "integrity": "sha512-coNOyRBHeB6XHbEYeJ8bd/vhPqGx1+KhXojEsQv9vN9sgONqgWEUk0p/XnIplIvI0E7M/hm8zheydhZNYC9xSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 20 <= 22" - } - }, - "node_modules/@nx/react/node_modules/@nx/eslint": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.5.2.tgz", - "integrity": "sha512-IpSgLc5PRWCTiiH2Kue9d/RS8Od6loHyfNbeUrSaJlN2Jq+WoxsGFtjsBHxJyQADu7MmlGZn8XutsbDQ8dbVKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "typescript": "~5.9.2" - }, - "peerDependencies": { - "@zkochan/js-yaml": "0.0.7", - "eslint": "^8.0.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "@zkochan/js-yaml": { - "optional": true - } - } - }, - "node_modules/@nx/react/node_modules/@nx/js": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.5.2.tgz", - "integrity": "sha512-zJDzdN0xY5dTw5fPR+IRVpKnRf/hl2WjyBGM42Jkda6vV9aR/sRkz8evXza781FWZ3o2P/wTZhQRMiO5O1fy4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.5.2", - "@nx/workspace": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^6.0.5" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } - } - }, - "node_modules/@nx/react/node_modules/@nx/nx-darwin-arm64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.5.2.tgz", - "integrity": "sha512-PrfZbV2blRHoWLor+xDVwPY/dk46kbsmuTXCZRYlNAwko521Y9dCAJT0UOROic3zoUasQ+TwqsQextIcKCotIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-darwin-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.5.2.tgz", - "integrity": "sha512-YaLY2Cqbjrl+pDddHV7GFtokn81GLvoqg+i9k0Eiid8B0dDLBZpJ3VQKr4RkTzxBX38UuHbJUwrZc8L9z8vqEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-freebsd-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.5.2.tgz", - "integrity": "sha512-2z/Wd42/KHFyT0zRVxWHlaRBQz12Fd1A0FCGJzuWI8G2meh9tYt4MN96gQ4q/rLQ0fmfFEEECq6pmOfCi8t9Mg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.5.2.tgz", - "integrity": "sha512-lY2O1py8x+l39XAFFuplKlzouPC9K/gERYEB/b5jHGf7PGfNj0BX2MDmUztgTty6kKUnkRele39aSoQqWok0gA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.5.2.tgz", - "integrity": "sha512-gcpkXXPpWaf8wB0FZUaKmk8Jdv+QMHLiOcQuuXYi1X0vbgotVTl/y+dccwG1EZml6V5JIRGtg2YDM61a7Olp1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.5.2.tgz", - "integrity": "sha512-oCSUwT0hORgFJWIGjwl6x4/2mVusw+3YAcSrvDePAXadjPSEMLZlJEE+4HExzqLFFBTxc+ucvyOIk08P4BtNJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.5.2.tgz", - "integrity": "sha512-rgJTQk0iaidxEIMOuRQJS36Sk4+qcpJP0uwymvgyoTpZyBdkX38NHH3D+E6sudPSFWsiVxJpkCzYE4ScSKF8Ew==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.5.2.tgz", - "integrity": "sha512-KeS36526VruYO9HzhFGqhE5tbps7e94DV0b4j5wfPr7V51EfPzvjAiMWllsQDARv67wdbQ80c0Wg516XTlekgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.5.2.tgz", - "integrity": "sha512-jlRTycYKOiSqc0fcqvabOH/HZX9BOG0S8EGsLmqEr2OkJLZc25ByD1n22P486R2n+m8GQwL6pX+L1LPpOPmz0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/react/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.5.2.tgz", - "integrity": "sha512-Ur8GPdz52kLS5uE9IQf0wBtGyvQm4Y3M1ZDjRkR+oGf26aVGNTK6C0+kMJPuggR4Z6lurmHYA34ViGi2hHPPpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/react/node_modules/@nx/vite": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-21.5.2.tgz", - "integrity": "sha512-YQJDqr5DoA1iOL6B+1rg2SxQN03bD4sRisDQCU6l9zGkwVQv08fKeka8gkJGtJWWk4QX02HHObQvlQYelfZ+vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "ajv": "^8.0.0", - "enquirer": "~2.3.6", - "picomatch": "4.0.2", - "semver": "^7.6.3", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", - "vitest": "^1.3.1 || ^2.0.0 || ^3.0.0" - } - }, - "node_modules/@nx/react/node_modules/@nx/web": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.5.2.tgz", - "integrity": "sha512-+3oBFCncou+Pxfieo+lSJazNhwJ7SW5dLQHdBImSiO25RUEQdBEBv9Zg+/qGJNMEWHmNw2a1txVGj1Ka+azx2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", - "picocolors": "^1.1.0", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/react/node_modules/@nx/workspace": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.5.2.tgz", - "integrity": "sha512-7IDa5xqVwGgZXrFGqyMzZTOq0Okxc0KH6M0mLfHJy1393iEUJjLByfkQ0nDyjsRZsLqo11WMOldapBDwy6MlaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "21.5.2", - "picomatch": "4.0.2", - "semver": "^7.6.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/react/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/react/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@nx/react/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@nx/react/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/react/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/react/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/react/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@nx/react/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/react/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/react/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/react/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@nx/react/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/react/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/react/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/react/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/react/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/react/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/react/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/react/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/react/node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/react/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/react/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/react/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/react/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/react/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/react/node_modules/nx": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.5.2.tgz", - "integrity": "sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^30.0.2", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tree-kill": "^1.2.2", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.5.2", - "@nx/nx-darwin-x64": "21.5.2", - "@nx/nx-freebsd-x64": "21.5.2", - "@nx/nx-linux-arm-gnueabihf": "21.5.2", - "@nx/nx-linux-arm64-gnu": "21.5.2", - "@nx/nx-linux-arm64-musl": "21.5.2", - "@nx/nx-linux-x64-gnu": "21.5.2", - "@nx/nx-linux-x64-musl": "21.5.2", - "@nx/nx-win32-arm64-msvc": "21.5.2", - "@nx/nx-win32-x64-msvc": "21.5.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nx/react/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/react/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/react/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/react/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/react/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/react/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/react/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nx/react/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/react/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/react/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nx/react/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/react/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nx/react/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/react/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nx/react/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/react/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/react/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@nx/react/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/react/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/react/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@nx/react/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nx/react/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@nx/react/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/react/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nx/rollup": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/rollup/-/rollup-21.5.2.tgz", - "integrity": "sha512-Myyjf1nhBxipH5SkWYm2IKZMhAqeHYrTp1oP/AoHzVh7eVyq3J2aEmS46zTRthDnXk5ZpH5/FQEsTnU08egfLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-image": "^3.0.3", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-typescript": "^12.1.0", - "autoprefixer": "^10.4.9", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "postcss": "^8.4.38", - "rollup": "^4.14.0", - "rollup-plugin-copy": "^3.5.0", - "rollup-plugin-postcss": "^4.0.2", - "rollup-plugin-typescript2": "^0.36.0", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/rollup/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/rollup/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" - } - }, - "node_modules/@nx/rollup/node_modules/@nx/devkit": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.5.2.tgz", - "integrity": "sha512-coNOyRBHeB6XHbEYeJ8bd/vhPqGx1+KhXojEsQv9vN9sgONqgWEUk0p/XnIplIvI0E7M/hm8zheydhZNYC9xSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 20 <= 22" - } - }, - "node_modules/@nx/rollup/node_modules/@nx/js": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.5.2.tgz", - "integrity": "sha512-zJDzdN0xY5dTw5fPR+IRVpKnRf/hl2WjyBGM42Jkda6vV9aR/sRkz8evXza781FWZ3o2P/wTZhQRMiO5O1fy4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.5.2", - "@nx/workspace": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^6.0.5" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } - } - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-darwin-arm64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.5.2.tgz", - "integrity": "sha512-PrfZbV2blRHoWLor+xDVwPY/dk46kbsmuTXCZRYlNAwko521Y9dCAJT0UOROic3zoUasQ+TwqsQextIcKCotIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-darwin-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.5.2.tgz", - "integrity": "sha512-YaLY2Cqbjrl+pDddHV7GFtokn81GLvoqg+i9k0Eiid8B0dDLBZpJ3VQKr4RkTzxBX38UuHbJUwrZc8L9z8vqEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-freebsd-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.5.2.tgz", - "integrity": "sha512-2z/Wd42/KHFyT0zRVxWHlaRBQz12Fd1A0FCGJzuWI8G2meh9tYt4MN96gQ4q/rLQ0fmfFEEECq6pmOfCi8t9Mg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.5.2.tgz", - "integrity": "sha512-lY2O1py8x+l39XAFFuplKlzouPC9K/gERYEB/b5jHGf7PGfNj0BX2MDmUztgTty6kKUnkRele39aSoQqWok0gA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.5.2.tgz", - "integrity": "sha512-gcpkXXPpWaf8wB0FZUaKmk8Jdv+QMHLiOcQuuXYi1X0vbgotVTl/y+dccwG1EZml6V5JIRGtg2YDM61a7Olp1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.5.2.tgz", - "integrity": "sha512-oCSUwT0hORgFJWIGjwl6x4/2mVusw+3YAcSrvDePAXadjPSEMLZlJEE+4HExzqLFFBTxc+ucvyOIk08P4BtNJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.5.2.tgz", - "integrity": "sha512-rgJTQk0iaidxEIMOuRQJS36Sk4+qcpJP0uwymvgyoTpZyBdkX38NHH3D+E6sudPSFWsiVxJpkCzYE4ScSKF8Ew==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.5.2.tgz", - "integrity": "sha512-KeS36526VruYO9HzhFGqhE5tbps7e94DV0b4j5wfPr7V51EfPzvjAiMWllsQDARv67wdbQ80c0Wg516XTlekgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.5.2.tgz", - "integrity": "sha512-jlRTycYKOiSqc0fcqvabOH/HZX9BOG0S8EGsLmqEr2OkJLZc25ByD1n22P486R2n+m8GQwL6pX+L1LPpOPmz0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.5.2.tgz", - "integrity": "sha512-Ur8GPdz52kLS5uE9IQf0wBtGyvQm4Y3M1ZDjRkR+oGf26aVGNTK6C0+kMJPuggR4Z6lurmHYA34ViGi2hHPPpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/rollup/node_modules/@nx/workspace": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.5.2.tgz", - "integrity": "sha512-7IDa5xqVwGgZXrFGqyMzZTOq0Okxc0KH6M0mLfHJy1393iEUJjLByfkQ0nDyjsRZsLqo11WMOldapBDwy6MlaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "21.5.2", - "picomatch": "4.0.2", - "semver": "^7.6.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/rollup/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/rollup/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@nx/rollup/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/rollup/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/rollup/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/rollup/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/rollup/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/rollup/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/rollup/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + }, + "node_modules/@nx/jest/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/@nx/rollup/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "node_modules/@nx/jest/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/@nx/rollup/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/@nx/jest/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@nx/rollup/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/@nx/jest/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-docker": "^2.0.0" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@nx/rollup/node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "node_modules/@nx/js": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-22.3.3.tgz", + "integrity": "sha512-L3MOb8cLc2TIg2R3hGC9FLlcuVqlqST/fztmOihw9wS3lo52E4v2gP/BpYGfRh/u9r6Ekm6LF03Or+VwYzPuzA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.3.3", + "@nx/workspace": "22.3.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } } }, - "node_modules/@nx/rollup/node_modules/jsonc-parser": { + "node_modules/@nx/js/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, "license": "MIT" }, - "node_modules/@nx/rollup/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/@nx/js/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@nx/rollup/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/@nx/js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "ISC" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@nx/rollup/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "node_modules/@nx/js/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/@nx/rollup/node_modules/nx": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.5.2.tgz", - "integrity": "sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==", + "node_modules/@nx/module-federation": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-22.3.3.tgz", + "integrity": "sha512-bo0qsW0hDhuyS/WnHQ1nndHcd7VeuMS3bxCwPJkPm8+qsVhWT88GO9WoYnlvdpx/LfTT/N6k1AOVOKAygRuUNQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^30.0.2", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tree-kill": "^1.2.2", - "tsconfig-paths": "^4.1.2", + "@module-federation/enhanced": "^0.21.2", + "@module-federation/node": "^2.7.21", + "@module-federation/sdk": "^0.21.2", + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "@nx/web": "22.3.3", + "@rspack/core": "^1.5.2", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "picocolors": "^1.1.0", "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.5.2", - "@nx/nx-darwin-x64": "21.5.2", - "@nx/nx-freebsd-x64": "21.5.2", - "@nx/nx-linux-arm-gnueabihf": "21.5.2", - "@nx/nx-linux-arm64-gnu": "21.5.2", - "@nx/nx-linux-arm64-musl": "21.5.2", - "@nx/nx-linux-x64-gnu": "21.5.2", - "@nx/nx-linux-x64-musl": "21.5.2", - "@nx/nx-win32-arm64-msvc": "21.5.2", - "@nx/nx-win32-x64-msvc": "21.5.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } + "webpack": "^5.101.3" } }, - "node_modules/@nx/rollup/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/@nx/module-federation/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/@nx/rollup/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "node_modules/@nx/module-federation/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/@nx/rollup/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "node_modules/@nx/module-federation/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/module-federation/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "ms": "2.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/module-federation/node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/module-federation/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8.0.0" } }, - "node_modules/@nx/rollup/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/@nx/module-federation/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nx/module-federation/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@nx/rollup/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "node_modules/@nx/module-federation/node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.8" } }, - "node_modules/@nx/rollup/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "node_modules/@nx/module-federation/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/@nx/rollup/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@nx/module-federation/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": ">= 6" + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@nx/rollup/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/@nx/module-federation/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/@nx/rollup/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/@nx/module-federation/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/@nx/rollup/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@nx/module-federation/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/@nx/rollup/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "node_modules/@nx/module-federation/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/rollup/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@nx/module-federation/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/@nx/rollup/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "node_modules/@nx/module-federation/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/@nx/rollup/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "node_modules/@nx/module-federation/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.6" } }, - "node_modules/@nx/rollup/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/@nx/module-federation/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/@nx/rspack": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-21.5.2.tgz", - "integrity": "sha512-3r2hMR6HpCFNdiqyDGfwsGtI7PP60RjKjGNlTD5v8xltcXjvHzzofxWRd7TrL5HzOWJkVRlfR1xUiKJrCiu9aw==", + "node_modules/@nx/module-federation/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "@nx/module-federation": "21.5.2", - "@nx/web": "21.5.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "@rspack/core": "^1.5.0", - "@rspack/dev-server": "^1.1.4", - "@rspack/plugin-react-refresh": "^1.0.0", - "autoprefixer": "^10.4.9", - "browserslist": "^4.21.4", - "css-loader": "^6.4.0", - "enquirer": "~2.3.6", - "express": "^4.21.2", - "http-proxy-middleware": "^3.0.5", - "less-loader": "^11.1.0", - "license-webpack-plugin": "^4.0.2", - "loader-utils": "^2.0.3", - "parse5": "4.0.0", - "picocolors": "^1.1.0", - "postcss": "^8.4.38", - "postcss-import": "~14.1.0", - "postcss-loader": "^8.1.1", - "sass": "^1.85.0", - "sass-embedded": "^1.83.4", - "sass-loader": "^16.0.4", - "source-map-loader": "^5.0.0", - "style-loader": "^3.3.0", - "ts-checker-rspack-plugin": "^1.1.1", - "tslib": "^2.3.0", - "webpack": "^5.101.3", - "webpack-node-externals": "^3.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, - "peerDependencies": { - "@module-federation/enhanced": "^0.18.0", - "@module-federation/node": "^2.7.11" + "engines": { + "node": ">= 0.8" } }, - "node_modules/@nx/rspack/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "node_modules/@nx/module-federation/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.8.0" } }, - "node_modules/@nx/rspack/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "node_modules/@nx/module-federation/node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "dev": true, "license": "MIT", "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/@nx/rspack/node_modules/@nx/devkit": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.5.2.tgz", - "integrity": "sha512-coNOyRBHeB6XHbEYeJ8bd/vhPqGx1+KhXojEsQv9vN9sgONqgWEUk0p/XnIplIvI0E7M/hm8zheydhZNYC9xSQ==", + "node_modules/@nx/module-federation/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, - "peerDependencies": { - "nx": ">= 20 <= 22" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@nx/rspack/node_modules/@nx/js": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.5.2.tgz", - "integrity": "sha512-zJDzdN0xY5dTw5fPR+IRVpKnRf/hl2WjyBGM42Jkda6vV9aR/sRkz8evXza781FWZ3o2P/wTZhQRMiO5O1fy4w==", + "node_modules/@nx/module-federation/node_modules/webpack": { + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.5.2", - "@nx/workspace": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" }, - "peerDependencies": { - "verdaccio": "^6.0.5" + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependenciesMeta": { - "verdaccio": { + "webpack-cli": { "optional": true } } }, - "node_modules/@nx/rspack/node_modules/@nx/nx-darwin-arm64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.5.2.tgz", - "integrity": "sha512-PrfZbV2blRHoWLor+xDVwPY/dk46kbsmuTXCZRYlNAwko521Y9dCAJT0UOROic3zoUasQ+TwqsQextIcKCotIA==", + "node_modules/@nx/nx-darwin-arm64": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.3.3.tgz", + "integrity": "sha512-zBAGFGLal09CxhQkdMpOVwcwa9Y01aFm88jTTn35s/DdIWsfngmPzz0t4mG7u2D05q7TJfGQ31pIf5GkNUjo6g==", "cpu": [ "arm64" ], @@ -16049,10 +12242,10 @@ "darwin" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-darwin-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.5.2.tgz", - "integrity": "sha512-YaLY2Cqbjrl+pDddHV7GFtokn81GLvoqg+i9k0Eiid8B0dDLBZpJ3VQKr4RkTzxBX38UuHbJUwrZc8L9z8vqEw==", + "node_modules/@nx/nx-darwin-x64": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.3.3.tgz", + "integrity": "sha512-6ZQ6rMqH8NY4Jz+Gc89D5bIH2NxZb5S/vaA4yJ9RrqAfl4QWchNFD5na+aRivSd+UdsYLPKKl6qohet5SE6vOg==", "cpu": [ "x64" ], @@ -16063,10 +12256,10 @@ "darwin" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-freebsd-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.5.2.tgz", - "integrity": "sha512-2z/Wd42/KHFyT0zRVxWHlaRBQz12Fd1A0FCGJzuWI8G2meh9tYt4MN96gQ4q/rLQ0fmfFEEECq6pmOfCi8t9Mg==", + "node_modules/@nx/nx-freebsd-x64": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.3.3.tgz", + "integrity": "sha512-J/PP5pIOQtR7ZzrFwP6d6h0yfY7r9EravG2m940GsgzGbtZGYIDqnh5Wdt+4uBWPH8VpdNOwFqH0afELtJA3MA==", "cpu": [ "x64" ], @@ -16077,10 +12270,10 @@ "freebsd" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.5.2.tgz", - "integrity": "sha512-lY2O1py8x+l39XAFFuplKlzouPC9K/gERYEB/b5jHGf7PGfNj0BX2MDmUztgTty6kKUnkRele39aSoQqWok0gA==", + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.3.3.tgz", + "integrity": "sha512-/zn0altzM15S7qAgXMaB41vHkEn18HyTVUvRrjmmwaVqk9WfmDmqOQlGWoJ6XCbpvKQ8bh14RyhR9LGw1JJkNA==", "cpu": [ "arm" ], @@ -16091,10 +12284,10 @@ "linux" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.5.2.tgz", - "integrity": "sha512-gcpkXXPpWaf8wB0FZUaKmk8Jdv+QMHLiOcQuuXYi1X0vbgotVTl/y+dccwG1EZml6V5JIRGtg2YDM61a7Olp1Q==", + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.3.3.tgz", + "integrity": "sha512-NmPeCexWIZHW9RM3lDdFENN9C3WtlQ5L4RSNFESIjreS921rgePhulsszYdGnHdcnKPYlBBJnX/NxVsfioBbnQ==", "cpu": [ "arm64" ], @@ -16105,10 +12298,10 @@ "linux" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.5.2.tgz", - "integrity": "sha512-oCSUwT0hORgFJWIGjwl6x4/2mVusw+3YAcSrvDePAXadjPSEMLZlJEE+4HExzqLFFBTxc+ucvyOIk08P4BtNJg==", + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.3.3.tgz", + "integrity": "sha512-K02U88Q0dpvCfmSXXvY7KbYQSa1m+mkYeqDBRHp11yHk1GoIqaHp8oEWda7FV4gsriNExPSS5tX1/QGVoLZrCw==", "cpu": [ "arm64" ], @@ -16119,10 +12312,10 @@ "linux" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.5.2.tgz", - "integrity": "sha512-rgJTQk0iaidxEIMOuRQJS36Sk4+qcpJP0uwymvgyoTpZyBdkX38NHH3D+E6sudPSFWsiVxJpkCzYE4ScSKF8Ew==", + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.3.3.tgz", + "integrity": "sha512-04TEbvgwRaB9ifr39YwJmWh3RuXb4Ry4m84SOJyjNXAfPrepcWgfIQn1VL2ul1Ybq+P023dLO9ME8uqFh6j1YQ==", "cpu": [ "x64" ], @@ -16133,10 +12326,10 @@ "linux" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.5.2.tgz", - "integrity": "sha512-KeS36526VruYO9HzhFGqhE5tbps7e94DV0b4j5wfPr7V51EfPzvjAiMWllsQDARv67wdbQ80c0Wg516XTlekgA==", + "node_modules/@nx/nx-linux-x64-musl": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.3.3.tgz", + "integrity": "sha512-uxBXx5q+S5OGatbYDxnamsKXRKlYn+Eq1nrCAHaf8rIfRoHlDiRV2PqtWuF+O2pxR5FWKpvr+/sZtt9rAf7KMw==", "cpu": [ "x64" ], @@ -16147,10 +12340,10 @@ "linux" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.5.2.tgz", - "integrity": "sha512-jlRTycYKOiSqc0fcqvabOH/HZX9BOG0S8EGsLmqEr2OkJLZc25ByD1n22P486R2n+m8GQwL6pX+L1LPpOPmz0A==", + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.3.3.tgz", + "integrity": "sha512-aOwlfD6ZA1K6hjZtbhBSp7s1yi3sHbMpLCa4stXzfhCCpKUv46HU/EdiWdE1N8AsyNFemPZFq81k1VTowcACdg==", "cpu": [ "arm64" ], @@ -16161,10 +12354,10 @@ "win32" ] }, - "node_modules/@nx/rspack/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.5.2.tgz", - "integrity": "sha512-Ur8GPdz52kLS5uE9IQf0wBtGyvQm4Y3M1ZDjRkR+oGf26aVGNTK6C0+kMJPuggR4Z6lurmHYA34ViGi2hHPPpA==", + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.3.3.tgz", + "integrity": "sha512-EDR8BtqeDvVNQ+kPwnfeSfmerYetitU3tDkxOMIybjKJDh69U2JwTB8n9ARwNaZQbNk7sCGNRUSZFTbAAUKvuQ==", "cpu": [ "x64" ], @@ -16175,139 +12368,523 @@ "win32" ] }, - "node_modules/@nx/rspack/node_modules/@nx/web": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.5.2.tgz", - "integrity": "sha512-+3oBFCncou+Pxfieo+lSJazNhwJ7SW5dLQHdBImSiO25RUEQdBEBv9Zg+/qGJNMEWHmNw2a1txVGj1Ka+azx2Q==", + "node_modules/@nx/react": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/react/-/react-22.3.3.tgz", + "integrity": "sha512-rbnI34j2UwvS8K5I6KS1IkndYI5psRV+jV7+NfVhfBpDLzEW4NU7WB1IVuK7t1grrLKFfTs7GKw5cTSX33hnNg==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", + "@nx/devkit": "22.3.3", + "@nx/eslint": "22.3.3", + "@nx/js": "22.3.3", + "@nx/module-federation": "22.3.3", + "@nx/rollup": "22.3.3", + "@nx/web": "22.3.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@svgr/webpack": "^8.0.1", + "express": "^4.21.2", + "file-loader": "^6.2.0", + "http-proxy-middleware": "^3.0.5", + "minimatch": "9.0.3", "picocolors": "^1.1.0", + "semver": "^7.6.3", "tslib": "^2.3.0" + }, + "optionalDependencies": { + "@nx/vite": "22.3.3" } }, - "node_modules/@nx/rspack/node_modules/@nx/workspace": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.5.2.tgz", - "integrity": "sha512-7IDa5xqVwGgZXrFGqyMzZTOq0Okxc0KH6M0mLfHJy1393iEUJjLByfkQ0nDyjsRZsLqo11WMOldapBDwy6MlaQ==", + "node_modules/@nx/react/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "21.5.2", - "picomatch": "4.0.2", - "semver": "^7.6.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/react/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/@nx/react/node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nx/react/node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/@nx/rspack/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "node_modules/@nx/react/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true, "license": "MIT" }, - "node_modules/@nx/rspack/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "node_modules/@nx/react/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "ms": "2.0.0" } }, - "node_modules/@nx/rspack/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@nx/react/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/react/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nx/react/node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nx/react/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/@nx/rspack/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/@nx/react/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/react/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/react/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/react/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/react/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/react/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/react/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/react/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nx/react/node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nx/react/node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nx/react/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", + "mime": "1.6.0", + "ms": "2.1.3", "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.8.0" } }, - "node_modules/@nx/rspack/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@nx/react/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nx/react/node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" + } + }, + "node_modules/@nx/react/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nx/react/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/rollup": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/rollup/-/rollup-22.3.3.tgz", + "integrity": "sha512-BJdOHx0CcZ6YMvn7quKTfh9C/X7X9s1e2XAZv+LC2vxiRdxN80w4cq04yZE8i5PPpQNC6SG3OWIG6eDlkJhw5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-image": "^3.0.3", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^12.1.0", + "autoprefixer": "^10.4.9", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "postcss": "^8.4.38", + "rollup": "^4.14.0", + "rollup-plugin-postcss": "^4.0.2", + "rollup-plugin-typescript2": "^0.36.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/rollup/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@nx/rspack/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@nx/rspack": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-22.3.3.tgz", + "integrity": "sha512-5GDYYeUctJTzWX3DYSvVQvbK+GMB9PX9m4FmjNRCaxVGWZAe1LM7oQz61vj501m+CbkXxh1+hsVTPXzYOtTolQ==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "@nx/module-federation": "22.3.3", + "@nx/web": "22.3.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@rspack/core": "^1.5.2", + "@rspack/dev-server": "^1.1.4", + "@rspack/plugin-react-refresh": "^1.0.0", + "autoprefixer": "^10.4.9", + "browserslist": "^4.26.0", + "css-loader": "^6.4.0", + "enquirer": "~2.3.6", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "less-loader": "^11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "parse5": "4.0.0", + "picocolors": "^1.1.0", + "postcss": "^8.4.38", + "postcss-import": "~14.1.0", + "postcss-loader": "^8.1.1", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "ts-checker-rspack-plugin": "^1.1.1", + "tslib": "^2.3.0", + "webpack": "^5.101.3", + "webpack-node-externals": "^3.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@module-federation/enhanced": "^0.21.2", + "@module-federation/node": "^2.7.21" } }, - "node_modules/@nx/rspack/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/@nx/rspack/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, "engines": { "node": ">= 0.6" } }, + "node_modules/@nx/rspack/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/@nx/rspack/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "dev": true, "license": "MIT" }, @@ -16364,58 +12941,72 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/rspack/node_modules/define-lazy-prop": { + "node_modules/@nx/rspack/node_modules/es-module-lexer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/@nx/rspack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/@nx/rspack/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/@nx/rspack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, "node_modules/@nx/rspack/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -16429,18 +13020,18 @@ } }, "node_modules/@nx/rspack/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -16457,17 +13048,25 @@ "node": ">= 0.6" } }, - "node_modules/@nx/rspack/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "node_modules/@nx/rspack/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^10.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@nx/rspack/node_modules/iconv-lite": { @@ -16483,88 +13082,10 @@ "node": ">=0.10.0" } }, - "node_modules/@nx/rspack/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/rspack/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/rspack/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/rspack/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/rspack/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/rspack/node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/rspack/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "node_modules/@nx/rspack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, @@ -16601,30 +13122,6 @@ "node": ">=8.9.0" } }, - "node_modules/@nx/rspack/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/rspack/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/@nx/rspack/node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -16678,136 +13175,6 @@ "node": ">= 0.6" } }, - "node_modules/@nx/rspack/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/rspack/node_modules/nx": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.5.2.tgz", - "integrity": "sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^30.0.2", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tree-kill": "^1.2.2", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.5.2", - "@nx/nx-darwin-x64": "21.5.2", - "@nx/nx-freebsd-x64": "21.5.2", - "@nx/nx-linux-arm-gnueabihf": "21.5.2", - "@nx/nx-linux-arm64-gnu": "21.5.2", - "@nx/nx-linux-arm64-musl": "21.5.2", - "@nx/nx-linux-x64-gnu": "21.5.2", - "@nx/nx-linux-x64-musl": "21.5.2", - "@nx/nx-win32-arm64-msvc": "21.5.2", - "@nx/nx-win32-x64-msvc": "21.5.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nx/rspack/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/rspack/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@nx/rspack/node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -16815,233 +13182,63 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/rspack/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/rspack/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/rspack/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/rspack/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@nx/rspack/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/@nx/rspack/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/rspack/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nx/rspack/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@nx/rspack/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/@nx/rspack/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/rspack/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "dev": true, "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/@nx/rspack/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@nx/rspack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/rspack/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@nx/rspack/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/rspack/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/rspack/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@nx/rspack/node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -17056,127 +13253,147 @@ "node": ">= 0.6" } }, - "node_modules/@nx/rspack/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/rspack/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/@nx/rspack/node_modules/webpack": { + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=12" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, "node_modules/@nx/vite": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-21.1.2.tgz", - "integrity": "sha512-qKb3CTPtcs3MsDebNW7PUS10IDB1+w//iXKFobwmclH4uW/HFUMRcdUrIsdcQfdmQPjGNTTM2fwmbgWJC4qmAw==", + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-22.3.3.tgz", + "integrity": "sha512-JYtQeKJVID6Am65M1gDxCBLyO7pA6p/dBxnQyWEHsbJ5VLiOyCxr+W+YOE4p4roVlQxjAaCMqvtGH3cWnNQWxg==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.1.2", - "@nx/js": "21.1.2", + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "@nx/vitest": "22.3.3", "@phenomnomnominal/tsquery": "~5.0.1", - "@swc/helpers": "~0.5.0", "ajv": "^8.0.0", "enquirer": "~2.3.6", "picomatch": "4.0.2", "semver": "^7.6.3", - "tsconfig-paths": "^4.1.2" + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vitest": "^1.3.1 || ^2.0.0 || ^3.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": "^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0" } }, - "node_modules/@nx/vite/node_modules/@nx/devkit": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", - "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", + "node_modules/@nx/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "engines": { + "node": ">=12" }, - "peerDependencies": { - "nx": "21.1.2" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@nx/web": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.1.2.tgz", - "integrity": "sha512-ONw3bEO6rc9DqM9Jnt6Rc5xkSBMzruWA2KvHVlU4qaoUs1VKbnmJ28dM72lFMn8wbOOeq+RG7GC2nBpifBPLHw==", + "node_modules/@nx/vitest": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/vitest/-/vitest-22.3.3.tgz", + "integrity": "sha512-9BNwWadIfT5EAnEPXLM0n/ucuJ7IQyn+QRMUkUBt6wmms9f0OKMtLpiFxHIMrnQDf0eEk845jo21j7Og2cCZyA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.1.2", - "@nx/js": "21.1.2", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", - "picocolors": "^1.1.0", + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "semver": "^7.6.3", "tslib": "^2.3.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + }, + "vitest": { + "optional": true + } } }, - "node_modules/@nx/web/node_modules/@nx/devkit": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", - "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", + "node_modules/@nx/web": { + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-22.3.3.tgz", + "integrity": "sha512-0iuAxXCljxCAfQ5N4SffMuf0CuUFGJoO5nzOTqnZ60pRy+JIWZ+DXfh7bfHxTEcE3JQ6nT/hbZVLPMVNleoy7Q==", "dev": true, "license": "MIT", "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": "21.1.2" + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" } }, "node_modules/@nx/webpack": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-21.5.2.tgz", - "integrity": "sha512-icBqtmsGhIECGqwCLSqHGVWOqmjBrbnawpnVSb0sF68ziZGmxwXwvsZEWwM3YAwoqgaJ8TO6bumcdpvvnWeYCQ==", + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-22.3.3.tgz", + "integrity": "sha512-Ga8KuMoTl7fVvOEMPk+l/+C//IHwbLeCyhBx4+9xsB6o+TqvB/P7M5S70VRB+BIpf9JRgO7KU6ZfabAUkDMqTA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "21.5.2", - "@nx/js": "21.5.2", + "@nx/devkit": "22.3.3", + "@nx/js": "22.3.3", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", "babel-loader": "^9.1.2", - "browserslist": "^4.21.4", + "browserslist": "^4.26.0", "copy-webpack-plugin": "^10.2.4", "css-loader": "^6.4.0", "css-minimizer-webpack-plugin": "^5.0.0", @@ -17207,272 +13424,6 @@ "webpack-subresource-integrity": "^5.1.0" } }, - "node_modules/@nx/webpack/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" - } - }, - "node_modules/@nx/webpack/node_modules/@nx/devkit": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.5.2.tgz", - "integrity": "sha512-coNOyRBHeB6XHbEYeJ8bd/vhPqGx1+KhXojEsQv9vN9sgONqgWEUk0p/XnIplIvI0E7M/hm8zheydhZNYC9xSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 20 <= 22" - } - }, - "node_modules/@nx/webpack/node_modules/@nx/js": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.5.2.tgz", - "integrity": "sha512-zJDzdN0xY5dTw5fPR+IRVpKnRf/hl2WjyBGM42Jkda6vV9aR/sRkz8evXza781FWZ3o2P/wTZhQRMiO5O1fy4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.5.2", - "@nx/workspace": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^6.0.5" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } - } - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-darwin-arm64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.5.2.tgz", - "integrity": "sha512-PrfZbV2blRHoWLor+xDVwPY/dk46kbsmuTXCZRYlNAwko521Y9dCAJT0UOROic3zoUasQ+TwqsQextIcKCotIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-darwin-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.5.2.tgz", - "integrity": "sha512-YaLY2Cqbjrl+pDddHV7GFtokn81GLvoqg+i9k0Eiid8B0dDLBZpJ3VQKr4RkTzxBX38UuHbJUwrZc8L9z8vqEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-freebsd-x64": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.5.2.tgz", - "integrity": "sha512-2z/Wd42/KHFyT0zRVxWHlaRBQz12Fd1A0FCGJzuWI8G2meh9tYt4MN96gQ4q/rLQ0fmfFEEECq6pmOfCi8t9Mg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.5.2.tgz", - "integrity": "sha512-lY2O1py8x+l39XAFFuplKlzouPC9K/gERYEB/b5jHGf7PGfNj0BX2MDmUztgTty6kKUnkRele39aSoQqWok0gA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.5.2.tgz", - "integrity": "sha512-gcpkXXPpWaf8wB0FZUaKmk8Jdv+QMHLiOcQuuXYi1X0vbgotVTl/y+dccwG1EZml6V5JIRGtg2YDM61a7Olp1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.5.2.tgz", - "integrity": "sha512-oCSUwT0hORgFJWIGjwl6x4/2mVusw+3YAcSrvDePAXadjPSEMLZlJEE+4HExzqLFFBTxc+ucvyOIk08P4BtNJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.5.2.tgz", - "integrity": "sha512-rgJTQk0iaidxEIMOuRQJS36Sk4+qcpJP0uwymvgyoTpZyBdkX38NHH3D+E6sudPSFWsiVxJpkCzYE4ScSKF8Ew==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.5.2.tgz", - "integrity": "sha512-KeS36526VruYO9HzhFGqhE5tbps7e94DV0b4j5wfPr7V51EfPzvjAiMWllsQDARv67wdbQ80c0Wg516XTlekgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.5.2.tgz", - "integrity": "sha512-jlRTycYKOiSqc0fcqvabOH/HZX9BOG0S8EGsLmqEr2OkJLZc25ByD1n22P486R2n+m8GQwL6pX+L1LPpOPmz0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.5.2.tgz", - "integrity": "sha512-Ur8GPdz52kLS5uE9IQf0wBtGyvQm4Y3M1ZDjRkR+oGf26aVGNTK6C0+kMJPuggR4Z6lurmHYA34ViGi2hHPPpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nx/webpack/node_modules/@nx/workspace": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.5.2.tgz", - "integrity": "sha512-7IDa5xqVwGgZXrFGqyMzZTOq0Okxc0KH6M0mLfHJy1393iEUJjLByfkQ0nDyjsRZsLqo11WMOldapBDwy6MlaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.5.2", - "@zkochan/js-yaml": "0.0.7", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "21.5.2", - "picomatch": "4.0.2", - "semver": "^7.6.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/webpack/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/webpack/node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@nx/webpack/node_modules/array-union": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", @@ -17504,36 +13455,6 @@ "webpack": ">=5" } }, - "node_modules/@nx/webpack/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/webpack/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@nx/webpack/node_modules/copy-webpack-plugin": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", @@ -17576,16 +13497,6 @@ "node": ">=10" } }, - "node_modules/@nx/webpack/node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/@nx/webpack/node_modules/css-loader": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", @@ -17622,22 +13533,36 @@ } } }, - "node_modules/@nx/webpack/node_modules/define-lazy-prop": { + "node_modules/@nx/webpack/node_modules/es-module-lexer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/@nx/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/@nx/webpack/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/@nx/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, "node_modules/@nx/webpack/node_modules/find-cache-dir": { "version": "4.0.0", @@ -17694,101 +13619,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/webpack/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/webpack/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/webpack/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/webpack/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/webpack/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/webpack/node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "node_modules/@nx/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, @@ -17841,29 +13675,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/webpack/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/@nx/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/@nx/webpack/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/@nx/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/@nx/webpack/node_modules/mini-css-extract-plugin": { "version": "2.4.7", @@ -17885,136 +13718,6 @@ "webpack": "^5.0.0" } }, - "node_modules/@nx/webpack/node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/nx": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.5.2.tgz", - "integrity": "sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^30.0.2", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tree-kill": "^1.2.2", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.5.2", - "@nx/nx-darwin-x64": "21.5.2", - "@nx/nx-freebsd-x64": "21.5.2", - "@nx/nx-linux-arm-gnueabihf": "21.5.2", - "@nx/nx-linux-arm64-gnu": "21.5.2", - "@nx/nx-linux-arm64-musl": "21.5.2", - "@nx/nx-linux-x64-gnu": "21.5.2", - "@nx/nx-linux-x64-musl": "21.5.2", - "@nx/nx-win32-arm64-msvc": "21.5.2", - "@nx/nx-win32-x64-msvc": "21.5.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nx/webpack/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/webpack/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@nx/webpack/node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", @@ -18096,87 +13799,6 @@ "webpack": "^5.0.0" } }, - "node_modules/@nx/webpack/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/webpack/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/webpack/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nx/webpack/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/webpack/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, "node_modules/@nx/webpack/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -18190,92 +13812,69 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/webpack/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@nx/webpack/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@nx/webpack/node_modules/webpack": { + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/webpack/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "bin": { + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/@nx/webpack/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "node_modules/@nx/webpack/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" + "node": ">= 6" } }, "node_modules/@nx/webpack/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "license": "MIT", "engines": { @@ -18286,262 +13885,190 @@ } }, "node_modules/@nx/workspace": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.1.2.tgz", - "integrity": "sha512-I4e/X/GN0Vx3FDZv/7bFYmXfOPmcMI3cDO/rg+TqudsuxVM7tJ7+8jtwdpU4I2IEpI6oU9FZ7Fu9R2uNqL5rrQ==", + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-22.3.3.tgz", + "integrity": "sha512-A7Qd1Yi/hp/VPvig6tV+JmlYVSA4WhckNkP1giYZoESpGLxRlpwINpd5ii3oafOlglUdEZ8AiS3X+RUg9QmCAQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.1.2", + "@nx/devkit": "22.3.3", "@zkochan/js-yaml": "0.0.7", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "21.1.2", + "nx": "22.3.3", "picomatch": "4.0.2", + "semver": "^7.6.3", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } }, - "node_modules/@nx/workspace/node_modules/@nx/devkit": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", - "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": "21.1.2" - } - }, - "node_modules/@nx/workspace/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@nx/workspace/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/core": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", - "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/types": "^14.0.0", + "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", - "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/types": "^13.10.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" }, "peerDependencies": { "@octokit/core": ">=6" } }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, "node_modules/@octokit/plugin-retry": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.2.1.tgz", - "integrity": "sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz", + "integrity": "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "engines": { - "node": ">= 18" + "node": ">= 20" }, "peerDependencies": { - "@octokit/core": ">=6" + "@octokit/core": ">=7" } }, "node_modules/@octokit/plugin-throttling": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.6.1.tgz", - "integrity": "sha512-bt3EBUkeKUzDQXRCcFrR9SWVqlLFRRqcCrr6uAorWt6NXTyjMKqcGrFmXqJy9NCbnKgiIZ2OXWq04theFc76Jg==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/types": "^13.7.0", + "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "engines": { - "node": ">= 18" + "node": ">= 20" }, "peerDependencies": { - "@octokit/core": "^6.1.3" - } - }, - "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "@octokit/core": "^7.0.0" } }, "node_modules/@octokit/request": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", - "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/types": "^14.0.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/openapi-types": "^25.1.0" + "@octokit/openapi-types": "^27.0.0" } }, "node_modules/@parcel/watcher": { @@ -18854,6 +14381,28 @@ "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/@phenomnomnominal/tsquery": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", @@ -18866,15 +14415,17 @@ "typescript": "^3 || ^4 || ^5" } }, - "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/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=14" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" } }, "node_modules/@pnpm/config.env-replace": { @@ -18883,7 +14434,6 @@ "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12.22.0" } @@ -18894,7 +14444,6 @@ "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "4.2.10" }, @@ -18907,8 +14456,7 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/@pnpm/npm-conf": { "version": "2.3.1", @@ -18916,7 +14464,6 @@ "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -18934,12 +14481,12 @@ "license": "MIT" }, "node_modules/@remix-run/router": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", - "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==", + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", "license": "MIT", "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, "node_modules/@rolldown/pluginutils": { @@ -19002,40 +14549,6 @@ } } }, - "node_modules/@rollup/plugin-commonjs/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@rollup/plugin-image": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-image/-/plugin-image-3.0.3.tgz", @@ -19105,9 +14618,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz", - "integrity": "sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz", + "integrity": "sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==", "dev": true, "license": "MIT", "dependencies": { @@ -19155,9 +14668,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", - "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", + "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", "cpu": [ "arm" ], @@ -19169,9 +14682,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", - "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz", + "integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==", "cpu": [ "arm64" ], @@ -19183,9 +14696,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", - "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz", + "integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==", "cpu": [ "arm64" ], @@ -19197,9 +14710,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", - "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz", + "integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==", "cpu": [ "x64" ], @@ -19211,9 +14724,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", - "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.2.tgz", + "integrity": "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==", "cpu": [ "arm64" ], @@ -19225,9 +14738,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", - "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz", + "integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==", "cpu": [ "x64" ], @@ -19239,9 +14752,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", - "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz", + "integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==", "cpu": [ "arm" ], @@ -19253,9 +14766,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", - "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz", + "integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==", "cpu": [ "arm" ], @@ -19267,9 +14780,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", - "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz", + "integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==", "cpu": [ "arm64" ], @@ -19281,9 +14794,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", - "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz", + "integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==", "cpu": [ "arm64" ], @@ -19295,9 +14808,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", - "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz", + "integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==", "cpu": [ "loong64" ], @@ -19308,38 +14821,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", - "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", - "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz", + "integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==", "cpu": [ "ppc64" ], @@ -19351,9 +14836,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", - "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz", + "integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==", "cpu": [ "riscv64" ], @@ -19365,9 +14850,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", - "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz", + "integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==", "cpu": [ "riscv64" ], @@ -19379,9 +14864,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", - "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz", + "integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==", "cpu": [ "s390x" ], @@ -19393,9 +14878,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", - "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz", + "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==", "cpu": [ "x64" ], @@ -19407,9 +14892,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", - "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz", + "integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==", "cpu": [ "x64" ], @@ -19421,9 +14906,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", - "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz", + "integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==", "cpu": [ "arm64" ], @@ -19435,9 +14920,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", - "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz", + "integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==", "cpu": [ "arm64" ], @@ -19449,9 +14934,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", - "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz", + "integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==", "cpu": [ "ia32" ], @@ -19463,9 +14948,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", - "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.2.tgz", + "integrity": "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==", "cpu": [ "x64" ], @@ -19477,9 +14962,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", - "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz", + "integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==", "cpu": [ "x64" ], @@ -19491,9 +14976,9 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.52.5.tgz", - "integrity": "sha512-ldY4tEzSMBHNwB8TfRpi7RRRjjyfKlwjdebw5pS1lu0xaY3g4RDc6ople2wEYulVOKVeH7ZJwRx0iw4pGtjMHg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.53.2.tgz", + "integrity": "sha512-oPSy4fH0C66muvPr/HU13K8X9QFO74Em+JUegHUpEwD61M3lihIlfrLpilhrEiiReFOfG00Qyhf7NGFuwkX2yA==", "dev": true, "license": "MIT", "dependencies": { @@ -19511,28 +14996,28 @@ } }, "node_modules/@rspack/binding": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.8.tgz", - "integrity": "sha512-/91CzhRl9r5BIQCgGsS7jA6MDbw1I2BQpbfcUUdkdKl2P79K3Zo/Mw/TvKzS86catwLaUQEgkGRmYawOfPg7ow==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.1.tgz", + "integrity": "sha512-qVTV1/UWpMSZktvK5A8+HolgR1Qf0nYR3Gg4Vax5x3/BcHDpwGZ0fbdFRUirGVWH/XwxZ81zoI6F2SZq7xbX+w==", "dev": true, "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.5.8", - "@rspack/binding-darwin-x64": "1.5.8", - "@rspack/binding-linux-arm64-gnu": "1.5.8", - "@rspack/binding-linux-arm64-musl": "1.5.8", - "@rspack/binding-linux-x64-gnu": "1.5.8", - "@rspack/binding-linux-x64-musl": "1.5.8", - "@rspack/binding-wasm32-wasi": "1.5.8", - "@rspack/binding-win32-arm64-msvc": "1.5.8", - "@rspack/binding-win32-ia32-msvc": "1.5.8", - "@rspack/binding-win32-x64-msvc": "1.5.8" + "@rspack/binding-darwin-arm64": "1.7.1", + "@rspack/binding-darwin-x64": "1.7.1", + "@rspack/binding-linux-arm64-gnu": "1.7.1", + "@rspack/binding-linux-arm64-musl": "1.7.1", + "@rspack/binding-linux-x64-gnu": "1.7.1", + "@rspack/binding-linux-x64-musl": "1.7.1", + "@rspack/binding-wasm32-wasi": "1.7.1", + "@rspack/binding-win32-arm64-msvc": "1.7.1", + "@rspack/binding-win32-ia32-msvc": "1.7.1", + "@rspack/binding-win32-x64-msvc": "1.7.1" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.8.tgz", - "integrity": "sha512-spJfpOSN3f7V90ic45/ET2NKB2ujAViCNmqb0iGurMNQtFRq+7Kd+jvVKKGXKBHBbsQrFhidSWbbqy2PBPGK8g==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.1.tgz", + "integrity": "sha512-3C0w0kfCHfgOH+AP/Dx1bm/b3AR/or5CmU22Abevek0m95ndU3iT902eLcm9JNiMQnDQLBQbolfj5P591t0oPg==", "cpu": [ "arm64" ], @@ -19544,9 +15029,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.8.tgz", - "integrity": "sha512-YFOzeL1IBknBcri8vjUp43dfUBylCeQnD+9O9p0wZmLAw7DtpN5JEOe2AkGo8kdTqJjYKI+cczJPKIw6lu1LWw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.1.tgz", + "integrity": "sha512-HTrBpdw2gWwcpJ3c8h4JF8B1YRNvrFT+K620ycttrlu/HvI4/U770BBJ/ej36R/hdh59JvMCGe+w49FyXv6rzg==", "cpu": [ "x64" ], @@ -19558,9 +15043,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.8.tgz", - "integrity": "sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.1.tgz", + "integrity": "sha512-BX9yAPCO0WBFyOzKl9bSXT/cH27nnOJp02smIQMxfv7RNfwGkJg5GgakYcuYG+9U1HEFitBSzmwS2+dxDcAxlg==", "cpu": [ "arm64" ], @@ -19572,9 +15057,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.8.tgz", - "integrity": "sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.1.tgz", + "integrity": "sha512-maBX19XyiVkxzh/NA79ALetCobc4zUyoWkWLeCGyW5xKzhPVFatJp+qCiHqHkqUZcgRo+1i5ihoZ2bXmelIeZg==", "cpu": [ "arm64" ], @@ -19586,9 +15071,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.8.tgz", - "integrity": "sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.1.tgz", + "integrity": "sha512-8KJAeBLiWcN7zEc9aaS7LRJPZVtZuQU8mCsn+fRhdQDSc+a9FcTN8b6Lw29z8cejwbU6Gxr/8wk5XGexMWFaZA==", "cpu": [ "x64" ], @@ -19600,9 +15085,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.8.tgz", - "integrity": "sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.1.tgz", + "integrity": "sha512-Gn9x5vhKRELvSoZ3ZjquY8eWtCXur0OsYnZ2/ump8mofM6IDaL7Qqu3Hf4Kud31PDH0tfz0jWf9piX32HHPmgg==", "cpu": [ "x64" ], @@ -19614,9 +15099,9 @@ ] }, "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.8.tgz", - "integrity": "sha512-cfg3niNHeJuxuml1Vy9VvaJrI/5TakzoaZvKX2g5S24wfzR50Eyy4JAsZ+L2voWQQp1yMJbmPYPmnTCTxdJQBQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.1.tgz", + "integrity": "sha512-2r9M5iVchmsFkp3sz7A5YnMm2TfpkB71LK3AoaRWKMfvf5oFky0GSGISYd2TCBASO+X2Qskaq+B24Szo8zH5FA==", "cpu": [ "wasm32" ], @@ -19624,13 +15109,13 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.5" + "@napi-rs/wasm-runtime": "1.0.7" } }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.8.tgz", - "integrity": "sha512-7i3ZTHFXKfU/9Jm9XhpMkrdkxO7lfeYMNVEGkuU5dyBfRMQj69dRgPL7zJwc2plXiqu9LUOl+TwDNTjap7Q36g==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.1.tgz", + "integrity": "sha512-/WIHp982yqqqAuiz2WLtf1ofo9d1lHDGZJ7flxFllb1iMgnUeSRyX6stxEi11K3Rg6pQa7FdCZGKX/engyj2bw==", "cpu": [ "arm64" ], @@ -19642,9 +15127,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.8.tgz", - "integrity": "sha512-7ZPPWO11J+soea1+mnfaPpQt7GIodBM7A86dx6PbXgVEoZmetcWPrCF2NBfXxQWOKJ9L3RYltC4z+ZyXRgMOrw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.1.tgz", + "integrity": "sha512-Kpela29n+kDGGsss6q/3qTd6n9VW7TOQaiA7t1YLdCCl8qqcdKlz/vWjFMd2MqgcSGC/16PvChE4sgpUvryfCQ==", "cpu": [ "ia32" ], @@ -19656,9 +15141,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.8.tgz", - "integrity": "sha512-N/zXQgzIxME3YUzXT8qnyzxjqcnXudWOeDh8CAG9zqTCnCiy16SFfQ/cQgEoLlD9geQntV6jx2GbDDI5kpDGMQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.1.tgz", + "integrity": "sha512-B/y4MWqP2Xeto1/HV0qtZNOMPSLrEVOqi2b7JSIXG/bhlf+3IAkDzEEoHs+ZikLR4C8hMaS0pVJsDGKFmGzC9A==", "cpu": [ "x64" ], @@ -19670,15 +15155,15 @@ ] }, "node_modules/@rspack/core": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.5.8.tgz", - "integrity": "sha512-sUd2LfiDhqYVfvknuoz0+/c+wSpn693xotnG5g1CSWKZArbtwiYzBIVnNlcHGmuoBRsnj/TkSq8dTQ7gwfBroQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.1.tgz", + "integrity": "sha512-kRxfY8RRa6nU3/viDvAIP6CRpx+0rfXFRonPL0pHBx8u6HhV7m9rLEyaN6MWsLgNIAWkleFGb7tdo4ux2ljRJQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.18.0", - "@rspack/binding": "1.5.8", - "@rspack/lite-tapable": "1.0.1" + "@module-federation/runtime-tools": "0.22.0", + "@rspack/binding": "1.7.1", + "@rspack/lite-tapable": "1.1.0" }, "engines": { "node": ">=18.12.0" @@ -19693,68 +15178,68 @@ } }, "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.18.0.tgz", - "integrity": "sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", + "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", "dev": true, "license": "MIT" }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.18.0.tgz", - "integrity": "sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", + "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.18.0", - "@module-federation/runtime-core": "0.18.0", - "@module-federation/sdk": "0.18.0" + "@module-federation/error-codes": "0.22.0", + "@module-federation/runtime-core": "0.22.0", + "@module-federation/sdk": "0.22.0" } }, "node_modules/@rspack/core/node_modules/@module-federation/runtime-core": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.18.0.tgz", - "integrity": "sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", + "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.18.0", - "@module-federation/sdk": "0.18.0" + "@module-federation/error-codes": "0.22.0", + "@module-federation/sdk": "0.22.0" } }, "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.18.0.tgz", - "integrity": "sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", + "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.18.0", - "@module-federation/webpack-bundler-runtime": "0.18.0" + "@module-federation/runtime": "0.22.0", + "@module-federation/webpack-bundler-runtime": "0.22.0" } }, "node_modules/@rspack/core/node_modules/@module-federation/sdk": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.18.0.tgz", - "integrity": "sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", + "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", "dev": true, "license": "MIT" }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.18.0.tgz", - "integrity": "sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", + "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.18.0", - "@module-federation/sdk": "0.18.0" + "@module-federation/runtime": "0.22.0", + "@module-federation/sdk": "0.22.0" } }, "node_modules/@rspack/dev-server": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.4.tgz", - "integrity": "sha512-kGHYX2jYf3ZiHwVl0aUEPBOBEIG1aWleCDCAi+Jg32KUu3qr/zDUpCEd0wPuHfLEgk0X0xAEYCS6JMO7nBStNQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.5.tgz", + "integrity": "sha512-cwz0qc6iqqoJhyWqxP7ZqE2wyYNHkBMQUXxoQ0tNoZ4YNRkDyQ4HVJ/3oPSmMKbvJk/iJ16u7xZmwG6sK47q/A==", "dev": true, "license": "MIT", "dependencies": { @@ -19874,19 +15359,16 @@ } }, "node_modules/@rspack/lite-tapable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", - "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", + "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } + "license": "MIT" }, "node_modules/@rspack/plugin-react-refresh": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.5.2.tgz", - "integrity": "sha512-uTbN6P01LPdQOnl5YNwHkN4hDsb9Sb5nIetQb55mPyFiJnu9MQetmBUm+tmh8JJg0QPv4Ew7tXgi4hjpHFY3Rw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.0.tgz", + "integrity": "sha512-OO53gkrte/Ty4iRXxxM6lkwPGxsSsupFKdrPFnjwFIYrPvFLjeolAl5cTx+FzO5hYygJiGnw7iEKTmD+ptxqDA==", "dev": true, "license": "MIT", "dependencies": { @@ -19911,9 +15393,9 @@ "license": "MIT" }, "node_modules/@rushstack/node-core-library": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.17.0.tgz", - "integrity": "sha512-24vt1GbHN6kyIglRMTVpyEiNRRRJK8uZHc1XoGAhmnTDKnrWet8OmOpImMswJIe6gM78eV8cMg1HXwuUHkSSgg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.18.0.tgz", + "integrity": "sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==", "dev": true, "license": "MIT", "dependencies": { @@ -20030,13 +15512,13 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.1.tgz", - "integrity": "sha512-jsBuSad67IDVMO2yp0hDfs0OdE4z3mDIjIL2pclDT3aEJboeZXE85e1HjuD0F6JoW3XgHvDwoX+WOV+AVTDQeA==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.3.tgz", + "integrity": "sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.17.0", + "@rushstack/node-core-library": "5.18.0", "@rushstack/problem-matcher": "0.1.1", "supports-color": "~8.1.1" }, @@ -20066,13 +15548,13 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.1.tgz", - "integrity": "sha512-HPzFsUcr+wZ3oQI08Ec/E6cuiAVHKzrXZGHhwiwIGygAFiqN5QzX+ff30n70NU2WyE26CykgMwBZZSSyHCJrzA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.3.tgz", + "integrity": "sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.19.1", + "@rushstack/terminal": "0.19.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -20110,8 +15592,7 @@ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@semantic-release/commit-analyzer": { "version": "11.1.0", @@ -20141,74 +15622,40 @@ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@semantic-release/github": { - "version": "10.3.5", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.3.5.tgz", - "integrity": "sha512-svvRglGmvqvxjmDgkXhrjf0lC88oZowFhOfifTldbgX9Dzj0inEtMLaC+3/MkDEmxmaQjWmF5Q/0CMIvPNSVdQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.2.tgz", + "integrity": "sha512-qyqLS+aSGH1SfXIooBKjs7mvrv0deg8v+jemegfJg1kq6ji+GJV8CO08VJDEsvjp3O8XJmTTIAjjZbMzagzsdw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/core": "^6.0.0", - "@octokit/plugin-paginate-rest": "^11.0.0", - "@octokit/plugin-retry": "^7.0.0", - "@octokit/plugin-throttling": "^9.0.0", + "@octokit/core": "^7.0.0", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-retry": "^8.0.0", + "@octokit/plugin-throttling": "^11.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", - "globby": "^14.0.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", "p-filter": "^4.0.0", + "tinyglobby": "^0.2.14", + "undici": "^7.0.0", "url-join": "^5.0.0" }, "engines": { - "node": ">=20.8.1" + "node": "^22.14.0 || >= 24.10.0" }, "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/github/node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" + "semantic-release": ">=24.1.0" } }, "node_modules/@semantic-release/github/node_modules/mime": { @@ -20220,7 +15667,6 @@ "https://github.com/sponsors/broofa" ], "license": "MIT", - "peer": true, "bin": { "mime": "bin/cli.js" }, @@ -20228,109 +15674,52 @@ "node": ">=16" } }, - "node_modules/@semantic-release/github/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@semantic-release/github/node_modules/url-join": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/@semantic-release/npm": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.2.tgz", - "integrity": "sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.3.tgz", + "integrity": "sha512-q7zreY8n9V0FIP1Cbu63D+lXtRAVAIWb30MH5U3TdrfXt6r2MIrWCY0whAImN53qNvSGp0Zt07U95K+Qp9GpEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { + "@actions/core": "^2.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", + "env-ci": "^11.2.0", "execa": "^9.0.0", "fs-extra": "^11.0.0", "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", "normalize-url": "^8.0.0", - "npm": "^10.9.3", + "npm": "^11.6.2", "rc": "^1.2.8", - "read-pkg": "^9.0.0", + "read-pkg": "^10.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", "tempy": "^3.0.0" }, "engines": { - "node": ">=20.8.1" + "node": "^22.14.0 || >= 24.10.0" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", - "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", @@ -20358,7 +15747,6 @@ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -20370,12 +15758,11 @@ } }, "node_modules/@semantic-release/npm/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -20391,7 +15778,6 @@ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -20409,7 +15795,6 @@ "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18.0" } @@ -20420,7 +15805,6 @@ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -20434,7 +15818,6 @@ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -20442,13 +15825,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/npm/node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/@semantic-release/npm/node_modules/npm-run-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" @@ -20460,13 +15857,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/npm/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/npm/node_modules/path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -20474,13 +15901,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/npm/node_modules/read-pkg": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz", + "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.2.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -20488,13 +15934,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/npm/node_modules/type-fest": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/npm/node_modules/unicorn-magic": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -20640,12 +16101,11 @@ } }, "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -20671,6 +16131,13 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, "node_modules/@sveltejs/vite-plugin-svelte": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", @@ -20983,11 +16450,29 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc-node/core": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.14.1.tgz", + "integrity": "sha512-jrt5GUaZUU6cmMS+WTJEvGvaB6j1YNKPHPzC2PUi2BjaFbtxURHj6641Az6xN7b665hNniAIdvjxWcRml5yCnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.13.3", + "@swc/types": ">= 0.1" + } + }, "node_modules/@swc-node/register": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.9.2.tgz", "integrity": "sha512-BBjg0QNuEEmJSoU/++JOXhrjWdu3PTyYeJWsvchsI0Aqtj8ICkz/DqlwtXbmZVZ5vuDPpTfFlwDBZe81zgShMA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@swc-node/core": "^1.13.1", @@ -21006,29 +16491,11 @@ "typescript": ">= 4.3" } }, - "node_modules/@swc-node/register/node_modules/@swc-node/core": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.14.1.tgz", - "integrity": "sha512-jrt5GUaZUU6cmMS+WTJEvGvaB6j1YNKPHPzC2PUi2BjaFbtxURHj6641Az6xN7b665hNniAIdvjxWcRml5yCnw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@swc/core": ">= 1.13.3", - "@swc/types": ">= 0.1" - } - }, "node_modules/@swc-node/sourcemap-support": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.1.tgz", "integrity": "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "source-map-support": "^0.5.21", @@ -21094,7 +16561,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.9.3.tgz", "integrity": "sha512-oRj0AFePUhtatX+BscVhnzaAmWjpfAeySpM1TCbxA1rtBDeH/JDhi5yYzAKneDYtVtBvA7ApfeuzhMC9ye4xSg==", - "devOptional": true, + "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -21136,6 +16603,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21152,6 +16620,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21168,6 +16637,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -21184,6 +16654,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21200,6 +16671,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21216,6 +16688,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21232,6 +16705,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21248,6 +16722,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21264,6 +16739,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21280,6 +16756,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -21293,7 +16770,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0" }, "node_modules/@swc/helpers": { @@ -21309,7 +16786,7 @@ "version": "0.1.25", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -21449,23 +16926,6 @@ "deep-equal": "^2.0.5" } }, - "node_modules/@testing-library/svelte/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@testing-library/svelte/node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -21567,9 +17027,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "license": "MIT" }, "node_modules/@tsconfig/node12": { @@ -21786,16 +17246,16 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { @@ -21811,27 +17271,6 @@ "@types/send": "*" } }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -21856,9 +17295,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "dev": true, "license": "MIT", "dependencies": { @@ -21994,20 +17433,13 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-forge": { @@ -22096,9 +17528,9 @@ "license": "MIT" }, "node_modules/@types/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", - "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22116,9 +17548,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", - "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "dependencies": { @@ -22128,9 +17560,9 @@ } }, "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "dev": true, "license": "MIT", "dependencies": { @@ -22172,9 +17604,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -22278,14 +17710,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", - "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", + "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.2", - "@typescript-eslint/types": "^8.46.2", + "@typescript-eslint/tsconfig-utils": "^8.47.0", + "@typescript-eslint/types": "^8.47.0", "debug": "^4.3.4" }, "engines": { @@ -22300,9 +17732,9 @@ } }, "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", + "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", "dev": true, "license": "MIT", "engines": { @@ -22332,9 +17764,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", - "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", + "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", "dev": true, "license": "MIT", "engines": { @@ -22349,15 +17781,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", - "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", + "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -22374,14 +17806,14 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", - "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", + "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22392,9 +17824,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", + "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", "dev": true, "license": "MIT", "engines": { @@ -22406,16 +17838,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", - "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", + "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/project-service": "8.47.0", + "@typescript-eslint/tsconfig-utils": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -22435,16 +17867,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", - "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", + "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22459,13 +17891,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", + "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/types": "8.47.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -22625,6 +18057,301 @@ "dev": true, "license": "ISC" }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -22661,15 +18388,15 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.5.tgz", - "integrity": "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.2.tgz", + "integrity": "sha512-OQm+yJdXxvSjqGeaWhP6Ia264ogifwAO7Q12uTDVYj/Ks4jBTI4JknlcjDRAXtRhqbWsfbZyK/5RtuIPyptk3w==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.24" + "@swc/types": "^0.1.25" }, "engines": { "node": ">=10" @@ -22679,16 +18406,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.13.5", - "@swc/core-darwin-x64": "1.13.5", - "@swc/core-linux-arm-gnueabihf": "1.13.5", - "@swc/core-linux-arm64-gnu": "1.13.5", - "@swc/core-linux-arm64-musl": "1.13.5", - "@swc/core-linux-x64-gnu": "1.13.5", - "@swc/core-linux-x64-musl": "1.13.5", - "@swc/core-win32-arm64-msvc": "1.13.5", - "@swc/core-win32-ia32-msvc": "1.13.5", - "@swc/core-win32-x64-msvc": "1.13.5" + "@swc/core-darwin-arm64": "1.15.2", + "@swc/core-darwin-x64": "1.15.2", + "@swc/core-linux-arm-gnueabihf": "1.15.2", + "@swc/core-linux-arm64-gnu": "1.15.2", + "@swc/core-linux-arm64-musl": "1.15.2", + "@swc/core-linux-x64-gnu": "1.15.2", + "@swc/core-linux-x64-musl": "1.15.2", + "@swc/core-win32-arm64-msvc": "1.15.2", + "@swc/core-win32-ia32-msvc": "1.15.2", + "@swc/core-win32-x64-msvc": "1.15.2" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -22700,9 +18427,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-darwin-arm64": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.5.tgz", - "integrity": "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.2.tgz", + "integrity": "sha512-Ghyz4RJv4zyXzrUC1B2MLQBbppIB5c4jMZJybX2ebdEQAvryEKp3gq1kBksCNsatKGmEgXul88SETU19sMWcrw==", "cpu": [ "arm64" ], @@ -22717,9 +18444,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-darwin-x64": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.5.tgz", - "integrity": "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.2.tgz", + "integrity": "sha512-7n/PGJOcL2QoptzL42L5xFFfXY5rFxLHnuz1foU+4ruUTG8x2IebGhtwVTpaDN8ShEv2UZObBlT1rrXTba15Zw==", "cpu": [ "x64" ], @@ -22734,9 +18461,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.5.tgz", - "integrity": "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.2.tgz", + "integrity": "sha512-ZUQVCfRJ9wimuxkStRSlLwqX4TEDmv6/J+E6FicGkQ6ssLMWoKDy0cAo93HiWt/TWEee5vFhFaSQYzCuBEGO6A==", "cpu": [ "arm" ], @@ -22751,9 +18478,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.5.tgz", - "integrity": "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.2.tgz", + "integrity": "sha512-GZh3pYBmfnpQ+JIg+TqLuz+pM+Mjsk5VOzi8nwKn/m+GvQBsxD5ectRtxuWUxMGNG8h0lMy4SnHRqdK3/iJl7A==", "cpu": [ "arm64" ], @@ -22768,9 +18495,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-linux-arm64-musl": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.5.tgz", - "integrity": "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.2.tgz", + "integrity": "sha512-5av6VYZZeneiYIodwzGMlnyVakpuYZryGzFIbgu1XP8wVylZxduEzup4eP8atiMDFmIm+s4wn8GySJmYqeJC0A==", "cpu": [ "arm64" ], @@ -22785,9 +18512,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-linux-x64-gnu": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.5.tgz", - "integrity": "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.2.tgz", + "integrity": "sha512-1nO/UfdCLuT/uE/7oB3EZgTeZDCIa6nL72cFEpdegnqpJVNDI6Qb8U4g/4lfVPkmHq2lvxQ0L+n+JdgaZLhrRA==", "cpu": [ "x64" ], @@ -22802,9 +18529,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-linux-x64-musl": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.5.tgz", - "integrity": "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.2.tgz", + "integrity": "sha512-Ksfrb0Tx310kr+TLiUOvB/I80lyZ3lSOp6cM18zmNRT/92NB4mW8oX2Jo7K4eVEI2JWyaQUAFubDSha2Q+439A==", "cpu": [ "x64" ], @@ -22819,9 +18546,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.5.tgz", - "integrity": "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.2.tgz", + "integrity": "sha512-IzUb5RlMUY0r1A9IuJrQ7Tbts1wWb73/zXVXT8VhewbHGoNlBKE0qUhKMED6Tv4wDF+pmbtUJmKXDthytAvLmg==", "cpu": [ "arm64" ], @@ -22836,9 +18563,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.5.tgz", - "integrity": "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.2.tgz", + "integrity": "sha512-kCATEzuY2LP9AlbU2uScjcVhgnCAkRdu62vbce17Ro5kxEHxYWcugkveyBRS3AqZGtwAKYbMAuNloer9LS/hpw==", "cpu": [ "ia32" ], @@ -22853,9 +18580,9 @@ } }, "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core-win32-x64-msvc": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.5.tgz", - "integrity": "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.2.tgz", + "integrity": "sha512-iJaHeYCF4jTn7OEKSa3KRiuVFIVYts8jYjNmCdyz1u5g8HRyTDISD76r8+ljEOgm36oviRQvcXaw6LFp1m0yyA==", "cpu": [ "x64" ], @@ -22869,64 +18596,63 @@ "node": ">=10" } }, - "node_modules/@vitejs/plugin-react-swc/node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "node_modules/@vitest/browser": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.13.tgz", + "integrity": "sha512-lruSgrYPVAJzKmX6EJYCg9nY+0A4VkeTLpTzf1jRD/XMjNbzD9yy7D499xmVKglwJczANYJXBvZSPGcRlon+0w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@vitest/mocker": "4.0.13", + "@vitest/utils": "4.0.13", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.13" } }, - "node_modules/@vitest/browser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.2.4.tgz", - "integrity": "sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==", + "node_modules/@vitest/browser-playwright": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.13.tgz", + "integrity": "sha512-oaRY+/pvwS4/sN2rE2aZh9jdli8EkXm5AidmXEbWRu2wW0omG9PmgChWCX2jsD9qRLQxXTSLl5oKezANNF6LnQ==", "dev": true, "license": "MIT", "dependencies": { - "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.6.1", - "@vitest/mocker": "3.2.4", - "@vitest/utils": "3.2.4", - "magic-string": "^0.30.17", - "sirv": "^3.0.1", - "tinyrainbow": "^2.0.0", - "ws": "^8.18.2" + "@vitest/browser": "4.0.13", + "@vitest/mocker": "4.0.13", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "playwright": "*", - "vitest": "3.2.4", - "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" + "vitest": "4.0.13" }, "peerDependenciesMeta": { "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true + "optional": false } } }, + "node_modules/@vitest/browser/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/@vitest/browser/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", @@ -22950,32 +18676,30 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", - "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.9.tgz", + "integrity": "sha512-70oyhP+Q0HlWBIeGSP74YBw5KSjYhNgSCQjvmuQFciMqnyF36WL2cIkcT7XD85G4JPmBQitEMUsx+XMFv2AzQA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", - "ast-v8-to-istanbul": "^0.3.3", - "debug": "^4.4.1", + "@vitest/utils": "4.0.9", + "ast-v8-to-istanbul": "^0.3.8", + "debug": "^4.4.3", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.9.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.1", + "std-env": "^3.10.0", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.2.4", - "vitest": "3.2.4" + "@vitest/browser": "4.0.9", + "vitest": "4.0.9" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -22993,6 +18717,33 @@ "node": ">=18" } }, + "node_modules/@vitest/coverage-v8/node_modules/@vitest/pretty-format": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.9.tgz", + "integrity": "sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/@vitest/utils": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.9.tgz", + "integrity": "sha512-cEol6ygTzY4rUPvNZM19sDf7zGa35IYTm9wfzkHoT/f5jX10IOY7QleWSOh5T0e3I3WVozwK5Asom79qW8DiuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.9", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", @@ -23009,39 +18760,77 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.9.tgz", + "integrity": "sha512-C2vyXf5/Jfj1vl4DQYxjib3jzyuswMi/KHHVN2z+H4v16hdJ7jMZ0OGe3uOVIt6LyJsAofDdaJNIFEpQcrSTFw==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.0.9", + "@vitest/utils": "4.0.9", + "chai": "^6.2.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.9.tgz", + "integrity": "sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/spy": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.9.tgz", + "integrity": "sha512-J9Ttsq0hDXmxmT8CUOWUr1cqqAj2FJRGTdyEjSR+NjoOGKEqkEWj+09yC0HhI8t1W6t4Ctqawl1onHgipJve1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.9.tgz", + "integrity": "sha512-cEol6ygTzY4rUPvNZM19sDf7zGa35IYTm9wfzkHoT/f5jX10IOY7QleWSOh5T0e3I3WVozwK5Asom79qW8DiuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.9", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.13.tgz", + "integrity": "sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", + "@vitest/spy": "4.0.13", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -23062,94 +18851,193 @@ "@types/estree": "^1.0.0" } }, + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.13.tgz", + "integrity": "sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.9.tgz", + "integrity": "sha512-aF77tsXdEvIJRkj9uJZnHtovsVIx22Ambft9HudC+XuG/on1NY/bf5dlDti1N35eJT+QZLb4RF/5dTIG18s98w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "4.0.9", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.9.tgz", + "integrity": "sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/@vitest/utils": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.9.tgz", + "integrity": "sha512-cEol6ygTzY4rUPvNZM19sDf7zGa35IYTm9wfzkHoT/f5jX10IOY7QleWSOh5T0e3I3WVozwK5Asom79qW8DiuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.9", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.9.tgz", + "integrity": "sha512-r1qR4oYstPbnOjg0Vgd3E8ADJbi4ditCzqr+Z9foUrRhIy778BleNyZMeAJ2EjV+r4ASAaDsdciC9ryMy8xMMg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", + "@vitest/pretty-format": "4.0.9", + "magic-string": "^0.30.21", "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.9.tgz", + "integrity": "sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/snapshot/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.13.tgz", + "integrity": "sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/ui": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz", - "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.9.tgz", + "integrity": "sha512-6HV2HHl9aRJ09TlYj/WAQxaa797Ezb5u0LpgabthlASAUAWKgw/W1DSPX7t848mMZmIUvzZgnUHGIylAoYHP0w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", + "@vitest/utils": "4.0.9", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", - "sirv": "^3.0.1", - "tinyglobby": "^0.2.14", - "tinyrainbow": "^2.0.0" + "sirv": "^3.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "3.2.4" + "vitest": "4.0.9" + } + }, + "node_modules/@vitest/ui/node_modules/@vitest/pretty-format": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.9.tgz", + "integrity": "sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui/node_modules/@vitest/utils": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.9.tgz", + "integrity": "sha512-cEol6ygTzY4rUPvNZM19sDf7zGa35IYTm9wfzkHoT/f5jX10IOY7QleWSOh5T0e3I3WVozwK5Asom79qW8DiuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.9", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.13.tgz", + "integrity": "sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.0.13", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" @@ -23185,28 +19073,28 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", - "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz", + "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.4", - "@vue/shared": "3.5.22", + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.24", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", - "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz", + "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.22", - "@vue/shared": "3.5.22" + "@vue/compiler-core": "3.5.24", + "@vue/shared": "3.5.24" } }, "node_modules/@vue/compiler-vue2": { @@ -23246,9 +19134,9 @@ } }, "node_modules/@vue/shared": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", - "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz", + "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==", "dev": true, "license": "MIT" }, @@ -23594,6 +19482,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "js-yaml": "^3.10.0", @@ -23603,6 +19492,17 @@ "node": ">=18.12.0" } }, + "node_modules/@zip.js/zip.js": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.10.tgz", + "integrity": "sha512-WVywWK8HSttmFFYSih7lUjjaV4zGzMxy992y0tHrZY4Wf9x/uNBA/XJ50RvfGjuuJKti4yueEHA2ol2pOq6VDg==", + "license": "BSD-3-Clause", + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=18.0.0" + } + }, "node_modules/@zkochan/js-yaml": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", @@ -23769,7 +19669,6 @@ "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" @@ -23787,7 +19686,6 @@ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -23859,25 +19757,26 @@ } }, "node_modules/algoliasearch": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.32.0.tgz", - "integrity": "sha512-84xBncKNPBK8Ae89F65+SyVcOihrIbm/3N7to+GpRBHEUXGjA3ydWTMpcRW6jmFzkBQ/eqYy/y+J+NBpJWYjBg==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-abtesting": "5.32.0", - "@algolia/client-analytics": "5.32.0", - "@algolia/client-common": "5.32.0", - "@algolia/client-insights": "5.32.0", - "@algolia/client-personalization": "5.32.0", - "@algolia/client-query-suggestions": "5.32.0", - "@algolia/client-search": "5.32.0", - "@algolia/ingestion": "1.32.0", - "@algolia/monitoring": "1.32.0", - "@algolia/recommend": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" @@ -23956,8 +19855,7 @@ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", @@ -24022,8 +19920,7 @@ "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/aria-query": { "version": "5.3.0", @@ -24198,6 +20095,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -24216,9 +20126,9 @@ "license": "MIT" }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.7.tgz", - "integrity": "sha512-kr1Hy6YRZBkGQSb6puP+D6FQ59Cx4m0siYhAxygMCAgadiWQ6oxAxQXHOMvJx67SJ63jRoVIIg5eXzUbbct1ww==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", + "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -24277,9 +20187,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", + "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", "dev": true, "funding": [ { @@ -24297,9 +20207,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -24318,7 +20228,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -24341,9 +20250,9 @@ } }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -24361,6 +20270,21 @@ "dequal": "^2.0.3" } }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -24382,22 +20306,6 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/babel-loader": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", @@ -24445,37 +20353,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", @@ -24492,18 +20369,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -24513,20 +20378,6 @@ "semver": "bin/semver.js" } }, - "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", @@ -24546,7 +20397,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -24562,7 +20413,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -24579,7 +20430,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "devOptional": true, + "dev": true, "license": "ISC", "engines": { "node": ">= 6" @@ -24609,13 +20460,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -24691,9 +20542,9 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz", - "integrity": "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -24726,9 +20577,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.19.tgz", - "integrity": "sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ==", + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -24762,14 +20613,14 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", - "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "css-select": "^5.1.0", - "css-what": "^6.1.0", + "css-select": "^6.0.0", + "css-what": "^7.0.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "htmlparser2": "^10.0.0", @@ -24782,12 +20633,11 @@ } }, "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/big.js": { "version": "5.2.2", @@ -24858,6 +20708,30 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -24873,37 +20747,28 @@ } }, "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "dev": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", - "debug": "^4.4.0", + "debug": "^4.4.3", "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", + "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/bonjour-service": { @@ -24929,8 +20794,7 @@ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.2", @@ -24954,9 +20818,9 @@ } }, "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -24973,11 +20837,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -25022,9 +20886,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -25042,7 +20906,7 @@ "license": "MIT", "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-builder": { @@ -25094,16 +20958,6 @@ "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cacache": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", @@ -25146,11 +21000,11 @@ "license": "ISC" }, "node_modules/cacache/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -25205,7 +21059,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -25237,7 +21090,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -25259,17 +21111,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -25296,9 +21137,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001751", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", - "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", "funding": [ { "type": "opencollective", @@ -25315,69 +21156,37 @@ ], "license": "CC-BY-4.0" }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } }, "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "license": "MIT" }, "node_modules/char-regex": { "version": "1.0.2", @@ -25389,21 +21198,11 @@ } }, "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } + "license": "MIT" }, "node_modules/chokidar": { "version": "4.0.3", @@ -25468,7 +21267,6 @@ "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -25485,7 +21283,6 @@ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -25515,7 +21312,6 @@ "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -25532,31 +21328,12 @@ "npm": ">=5.0.0" } }, - "node_modules/cli-highlight/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/cli-highlight/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -25568,8 +21345,7 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { "version": "3.0.0", @@ -25577,7 +21353,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -25587,8 +21362,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cli-highlight/node_modules/string-width": { "version": "4.2.3", @@ -25596,7 +21370,6 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -25612,7 +21385,6 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -25631,7 +21403,6 @@ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -25651,7 +21422,6 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -25674,7 +21444,6 @@ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "string-width": "^4.2.0" }, @@ -25690,8 +21459,7 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { "version": "3.0.0", @@ -25699,7 +21467,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -25710,7 +21477,6 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -25967,7 +21733,7 @@ "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/colorjs.io": { @@ -26044,6 +21810,18 @@ "dev": true, "license": "MIT" }, + "node_modules/component-emitter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-2.0.0.tgz", + "integrity": "sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -26142,7 +21920,6 @@ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -26153,8 +21930,7 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", @@ -26173,18 +21949,6 @@ "node": ">=0.8" } }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -26277,7 +22041,6 @@ "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -26340,9 +22103,9 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", - "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz", + "integrity": "sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==", "dev": true, "license": "MIT", "dependencies": { @@ -26435,9 +22198,9 @@ } }, "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -26469,23 +22232,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -26509,7 +22255,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -26526,7 +22271,6 @@ "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^1.0.1" }, @@ -26543,7 +22287,6 @@ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -26571,9 +22314,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", - "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", + "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", "dev": true, "license": "ISC", "engines": { @@ -26700,17 +22443,17 @@ } }, "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -26731,9 +22474,9 @@ } }, "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -26911,9 +22654,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, "license": "MIT" }, @@ -27093,16 +22836,6 @@ } } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -27116,7 +22849,6 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -27138,9 +22870,9 @@ } }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "dev": true, "license": "MIT", "dependencies": { @@ -27155,9 +22887,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "engines": { @@ -27194,7 +22926,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -27225,7 +22956,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -27307,17 +23037,14 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/detect-newline": { @@ -27567,7 +23294,6 @@ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -27576,7 +23302,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, "license": "MIT" }, "node_modules/ee-first": { @@ -27602,9 +23327,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.237", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", - "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "license": "ISC" }, "node_modules/emittery": { @@ -27623,7 +23348,6 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, "license": "MIT" }, "node_modules/emojilib": { @@ -27631,8 +23355,7 @@ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -27731,7 +23454,6 @@ "integrity": "sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "execa": "^8.0.0", "java-properties": "^1.0.2" @@ -27746,7 +23468,6 @@ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -27771,7 +23492,6 @@ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16" }, @@ -27785,7 +23505,6 @@ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=16.17.0" } @@ -27796,7 +23515,6 @@ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -27810,7 +23528,6 @@ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -27824,7 +23541,6 @@ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^4.0.0" }, @@ -27841,7 +23557,6 @@ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^4.0.0" }, @@ -27858,7 +23573,6 @@ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -27872,7 +23586,6 @@ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -28159,9 +23872,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -28172,37 +23885,38 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/esbuild-wasm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.5.tgz", - "integrity": "sha512-V/rbdOws2gDcnCAECfPrajhuafI0WY4WumUgc8ZHwOLnvmM0doLQ+dqvVFI2qkVxQsvo6880aC9IjpyDqcwwTw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.9.tgz", + "integrity": "sha512-Jpv5tCSwQg18aCqCRD3oHIX/prBhXMDapIoG//A+6+dV0e7KQMGFg85ihJ5T1EeMjbZjON3TqFy0VrGAnIHLDA==", "dev": true, "license": "MIT", "bin": { @@ -28765,23 +24479,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -28816,9 +24513,9 @@ } }, "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -28963,7 +24660,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" @@ -29041,6 +24737,16 @@ "node": ">= 0.8.0" } }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -29088,19 +24794,20 @@ "license": "Apache-2.0" }, "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.0", + "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", + "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", @@ -29147,22 +24854,23 @@ } }, "node_modules/express/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", "dev": true, "license": "MIT" }, @@ -29194,9 +24902,9 @@ } }, "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", "dev": true, "funding": [ { @@ -29208,8 +24916,7 @@ "url": "https://opencollective.com/fastify" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -29549,9 +25256,9 @@ } }, "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, "license": "MIT", "dependencies": { @@ -29563,7 +25270,11 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/find-cache-dir": { @@ -29770,7 +25481,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -29786,7 +25496,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", @@ -29872,23 +25581,6 @@ "concat-map": "0.0.1" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -30035,9 +25727,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -30092,16 +25784,16 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -30177,12 +25869,6 @@ "dev": true, "license": "Unlicense" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -30212,7 +25898,6 @@ "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -30255,7 +25940,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -30385,7 +26069,6 @@ "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argv-formatter": "~1.0.0", "spawn-error-forwarder": "~1.0.0", @@ -30401,28 +26084,29 @@ "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "through2": "~2.0.0" } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-12.0.0.tgz", + "integrity": "sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -30444,7 +26128,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -30465,16 +26148,15 @@ "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -30705,7 +26387,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -30779,24 +26460,12 @@ "he": "bin/he" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": "*" } @@ -30815,38 +26484,40 @@ } }, "node_modules/hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-4.0.0.tgz", + "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "20 || >=22" + } }, "node_modules/hpack.js": { "version": "2.1.6", @@ -31104,23 +26775,6 @@ "node": ">=12" } }, - "node_modules/http-server/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", @@ -31163,7 +26817,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.18" @@ -31261,11 +26914,11 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -31435,17 +27088,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -31463,9 +27105,9 @@ } }, "node_modules/injection-js": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.6.0.tgz", - "integrity": "sha512-uRUO2qh7rFFeAo3UWTbLHCFr8x3VLHRNZ2jbMv/MAxbFIFgw7QtNVfxc3iC7CV5U11cvIyAt12nxVWu1NqVsYg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.6.1.tgz", + "integrity": "sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==", "dev": true, "license": "MIT", "dependencies": { @@ -31515,9 +27157,9 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, "license": "MIT", "engines": { @@ -31538,7 +27180,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -31645,7 +27286,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -31771,7 +27411,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.4", @@ -31851,6 +27490,22 @@ "dev": true, "license": "MIT" }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -31971,7 +27626,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -32080,7 +27734,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -32195,7 +27848,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/isobject": { @@ -32224,7 +27876,6 @@ "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", @@ -32330,19 +27981,18 @@ } }, "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jake": { @@ -32368,7 +28018,6 @@ "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6.0" } @@ -32446,20 +28095,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-circus/node_modules/pretty-format": { @@ -32476,18 +28121,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-circus/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -32528,23 +28161,6 @@ } } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-cli/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -32641,63 +28257,16 @@ } } }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-config/node_modules/pretty-format": { @@ -32714,18 +28283,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-config/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -32747,20 +28304,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-diff/node_modules/pretty-format": { @@ -32777,18 +28330,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-diff/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -32823,20 +28364,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-each/node_modules/pretty-format": { @@ -32853,18 +28390,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-each/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -33048,6 +28573,16 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/jest-environment-jsdom/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -33245,20 +28780,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { @@ -33275,18 +28806,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-matcher-utils/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -33313,20 +28832,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-message-util/node_modules/pretty-format": { @@ -33343,18 +28858,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-message-util/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -33504,22 +29007,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", @@ -33552,22 +29039,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-runner/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -33620,65 +29091,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", @@ -33710,20 +29122,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/pretty-format": { @@ -33740,18 +29148,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-snapshot/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -33775,22 +29171,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -33820,20 +29200,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-validate/node_modules/pretty-format": { @@ -33850,18 +29226,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-validate/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -33887,22 +29251,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -33950,6 +29298,16 @@ "dev": true, "license": "MIT" }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -33957,9 +29315,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -34107,8 +29465,7 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "4.0.0", @@ -34127,6 +29484,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -34248,6 +29612,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "license": "MIT", "dependencies": { @@ -34298,9 +29663,9 @@ } }, "node_modules/koa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.1.tgz", - "integrity": "sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.3.tgz", + "integrity": "sha512-MeuwbCoN1daWS32/Ni5qkzmrOtQO2qrnfdxDHjrm6s4b59yG4nexAJ0pTEFyzjLp0pBVO80CZp0vW8Ze30Ebow==", "dev": true, "license": "MIT", "dependencies": { @@ -34419,9 +29784,9 @@ } }, "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -34430,9 +29795,9 @@ } }, "node_modules/less": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz", - "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", + "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -34595,9 +29960,9 @@ } }, "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", "dev": true, "license": "MIT", "dependencies": { @@ -34609,7 +29974,7 @@ "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/listr2/node_modules/ansi-regex": { @@ -34705,9 +30070,9 @@ } }, "node_modules/lmdb": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.1.tgz", - "integrity": "sha512-hoG9RIv42kdGJiieyElgWcKCTaw5S6Jqwyd1gLSVdsJ3+8MVm8e4yLronThiRJI9DazFAAs9xfB9nWeMQ2DWKA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", + "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -34723,30 +30088,21 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.4.1", - "@lmdb/lmdb-darwin-x64": "3.4.1", - "@lmdb/lmdb-linux-arm": "3.4.1", - "@lmdb/lmdb-linux-arm64": "3.4.1", - "@lmdb/lmdb-linux-x64": "3.4.1", - "@lmdb/lmdb-win32-arm64": "3.4.1", - "@lmdb/lmdb-win32-x64": "3.4.1" + "@lmdb/lmdb-darwin-arm64": "3.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" } }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -34763,7 +30119,6 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -34778,7 +30133,6 @@ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -34789,7 +30143,6 @@ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -34885,8 +30238,7 @@ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", @@ -34906,24 +30258,21 @@ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -34951,8 +30300,7 @@ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols": { "version": "6.0.0", @@ -35018,9 +30366,9 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -35188,13 +30536,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -35258,15 +30599,46 @@ } }, "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-asynchronous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.0.1.tgz", + "integrity": "sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-event": "^6.0.0", + "type-fest": "^4.6.0", + "web-worker": "1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir": { @@ -35323,12 +30695,11 @@ } }, "node_modules/marked": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", - "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -35342,7 +30713,6 @@ "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-escapes": "^7.0.0", "ansi-regex": "^6.1.0", @@ -35360,12 +30730,11 @@ } }, "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "environment": "^1.0.0" }, @@ -35382,7 +30751,6 @@ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -35396,7 +30764,6 @@ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -35543,16 +30910,20 @@ } }, "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mimic-fn": { @@ -35601,9 +30972,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -35666,7 +31037,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -35957,7 +31327,6 @@ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -35983,6 +31352,22 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -36043,8 +31428,7 @@ "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ng-packagr": { "version": "20.1.0", @@ -36097,9 +31481,9 @@ } }, "node_modules/ng-packagr/node_modules/commander": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", - "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "dev": true, "license": "MIT", "engines": { @@ -36125,9 +31509,9 @@ "license": "MIT" }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, "license": "MIT", "optional": true @@ -36138,7 +31522,6 @@ "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -36155,7 +31538,6 @@ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -36210,9 +31592,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", + "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { @@ -36255,20 +31637,9 @@ "detect-libc": "^2.0.1" }, "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" } }, "node_modules/node-gyp/node_modules/chownr": { @@ -36292,11 +31663,11 @@ } }, "node_modules/node-gyp/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -36347,9 +31718,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", - "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/node-schedule": { @@ -36451,15 +31822,16 @@ } }, "node_modules/npm": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.4.tgz", - "integrity": "sha512-OnUG836FwboQIbqtefDNlyR0gTHzIfwRfE3DuiNewBvnMnWEpB0VEXwBlFVgqpNzIgYo/MHh3d2Hel/pszapAA==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.7.0.tgz", + "integrity": "sha512-wiCZpv/41bIobCoJ31NStIWKfAxxYyD1iYnWCtiyns8s5v3+l8y0HCP/sScuH6B5+GhIfda4HQKiqeGZwJWhFw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", "@npmcli/config", "@npmcli/fs", "@npmcli/map-workspaces", + "@npmcli/metavuln-calculator", "@npmcli/package-json", "@npmcli/promise-spawn", "@npmcli/redact", @@ -36484,7 +31856,6 @@ "libnpmdiff", "libnpmexec", "libnpmfund", - "libnpmhook", "libnpmorg", "libnpmpack", "libnpmpublish", @@ -36498,7 +31869,6 @@ "ms", "node-gyp", "nopt", - "normalize-package-data", "npm-audit-report", "npm-install-checks", "npm-package-arg", @@ -36521,12 +31891,10 @@ "tiny-relative-date", "treeverse", "validate-npm-package-name", - "which", - "write-file-atomic" + "which" ], "dev": true, "license": "Artistic-2.0", - "peer": true, "workspaces": [ "docs", "smoke-tests", @@ -36536,80 +31904,78 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^8.0.1", - "@npmcli/config": "^9.0.0", - "@npmcli/fs": "^4.0.0", - "@npmcli/map-workspaces": "^4.0.2", - "@npmcli/package-json": "^6.2.0", - "@npmcli/promise-spawn": "^8.0.2", - "@npmcli/redact": "^3.2.2", - "@npmcli/run-script": "^9.1.0", - "@sigstore/tuf": "^3.1.1", - "abbrev": "^3.0.1", + "@npmcli/arborist": "^9.1.9", + "@npmcli/config": "^10.4.5", + "@npmcli/fs": "^5.0.0", + "@npmcli/map-workspaces": "^5.0.3", + "@npmcli/metavuln-calculator": "^9.0.3", + "@npmcli/package-json": "^7.0.4", + "@npmcli/promise-spawn": "^9.0.1", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.3", + "@sigstore/tuf": "^4.0.0", + "abbrev": "^4.0.0", "archy": "~1.0.0", - "cacache": "^19.0.1", - "chalk": "^5.4.1", - "ci-info": "^4.2.0", + "cacache": "^20.0.3", + "chalk": "^5.6.2", + "ci-info": "^4.3.1", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.4.5", + "glob": "^13.0.0", "graceful-fs": "^4.2.11", - "hosted-git-info": "^8.1.0", - "ini": "^5.0.0", - "init-package-json": "^7.0.2", - "is-cidr": "^5.1.1", - "json-parse-even-better-errors": "^4.0.0", - "libnpmaccess": "^9.0.0", - "libnpmdiff": "^7.0.1", - "libnpmexec": "^9.0.1", - "libnpmfund": "^6.0.1", - "libnpmhook": "^11.0.0", - "libnpmorg": "^7.0.0", - "libnpmpack": "^8.0.1", - "libnpmpublish": "^10.0.1", - "libnpmsearch": "^8.0.0", - "libnpmteam": "^7.0.0", - "libnpmversion": "^7.0.0", - "make-fetch-happen": "^14.0.3", - "minimatch": "^9.0.5", + "hosted-git-info": "^9.0.2", + "ini": "^6.0.0", + "init-package-json": "^8.2.4", + "is-cidr": "^6.0.1", + "json-parse-even-better-errors": "^5.0.0", + "libnpmaccess": "^10.0.3", + "libnpmdiff": "^8.0.12", + "libnpmexec": "^10.1.11", + "libnpmfund": "^7.0.12", + "libnpmorg": "^8.0.1", + "libnpmpack": "^9.0.12", + "libnpmpublish": "^11.1.3", + "libnpmsearch": "^9.0.1", + "libnpmteam": "^8.0.2", + "libnpmversion": "^8.0.3", + "make-fetch-happen": "^15.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^11.2.0", - "nopt": "^8.1.0", - "normalize-package-data": "^7.0.0", - "npm-audit-report": "^6.0.0", - "npm-install-checks": "^7.1.1", - "npm-package-arg": "^12.0.2", - "npm-pick-manifest": "^10.0.0", - "npm-profile": "^11.0.1", - "npm-registry-fetch": "^18.0.2", - "npm-user-validate": "^3.0.0", - "p-map": "^7.0.3", - "pacote": "^19.0.1", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", + "node-gyp": "^12.1.0", + "nopt": "^9.0.0", + "npm-audit-report": "^7.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.2", + "npm-pick-manifest": "^11.0.3", + "npm-profile": "^12.0.1", + "npm-registry-fetch": "^19.1.1", + "npm-user-validate": "^4.0.0", + "p-map": "^7.0.4", + "pacote": "^21.0.4", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", - "read": "^4.1.0", - "semver": "^7.7.2", + "read": "^5.0.1", + "semver": "^7.7.3", "spdx-expression-parse": "^4.0.0", - "ssri": "^12.0.0", - "supports-color": "^9.4.0", - "tar": "^6.2.1", + "ssri": "^13.0.0", + "supports-color": "^10.2.2", + "tar": "^7.5.2", "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", + "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", - "validate-npm-package-name": "^6.0.1", - "which": "^5.0.0", - "write-file-atomic": "^6.0.0" + "validate-npm-package-name": "^7.0.0", + "which": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-bundled": { @@ -36649,35 +32015,45 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", "dev": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^8.0.0", + "hosted-git-info": "^9.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-packlist": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.2.tgz", - "integrity": "sha512-DrIWNiWT0FTdDRjGOYfEEZUNe1IzaSZ+up7qBTKnrQDySpdmuOQvytrqQlpK5QrCA4IThMvL4wTumqaa1ZvVIQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", + "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", "dev": true, "license": "ISC", "dependencies": { "ignore-walk": "^8.0.0", - "proc-log": "^5.0.0" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/npm-packlist/node_modules/proc-log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.0.0.tgz", + "integrity": "sha512-KG/XsTDN901PNfPfAMmj6N/Ywg9tM+bHK8pAz+27fS4N4Pcr+4zoYBOcGSBu6ceXYNPxkLpa4ohtfxV1XcLAfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/npm-pick-manifest": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", @@ -36694,6 +32070,42 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm-registry-fetch": { "version": "18.0.2", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", @@ -36714,88 +32126,73 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", + "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", "dependencies": { - "path-key": "^3.0.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, - "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "dev": true, - "inBundle": true, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" + "dependencies": { + "path-key": "^3.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", + "node_modules/npm/node_modules/@isaacs/balanced-match": { + "version": "4.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "20 || >=22" } }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "node_modules/npm/node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "20 || >=22" } }, "node_modules/npm/node_modules/@isaacs/fs-minipass": { @@ -36803,7 +32200,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -36815,365 +32211,388 @@ "version": "1.1.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", + "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "8.0.1", + "version": "9.1.9", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^4.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/metavuln-calculator": "^8.0.0", - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.1", - "@npmcli/query": "^4.0.0", - "@npmcli/redact": "^3.0.0", - "@npmcli/run-script": "^9.0.1", - "bin-links": "^5.0.0", - "cacache": "^19.0.1", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/metavuln-calculator": "^9.0.2", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.0", + "bin-links": "^6.0.0", + "cacache": "^20.0.1", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", + "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^8.0.0", - "npm-install-checks": "^7.1.0", - "npm-package-arg": "^12.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.1", - "pacote": "^19.0.0", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", - "proggy": "^3.0.0", + "lru-cache": "^11.2.1", + "minimatch": "^10.0.3", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.0", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "pacote": "^21.0.2", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" + "walk-up-path": "^4.0.0" }, "bin": { "arborist": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "9.0.0", + "version": "10.4.5", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/package-json": "^6.0.1", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/package-json": "^7.0.0", "ci-info": "^4.0.0", - "ini": "^5.0.0", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "walk-up-path": "^3.0.1" + "walk-up-path": "^4.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "6.0.3", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "4.0.2", + "version": "5.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0" + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "8.0.1", + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "cacache": "^19.0.0", - "json-parse-even-better-errors": "^4.0.0", - "pacote": "^20.0.0", - "proc-log": "^5.0.0", + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", + "pacote": "^21.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": { - "version": "20.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "6.2.0", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", + "version": "9.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "4.0.1", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/redact": { - "version": "3.2.2", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "9.1.0", + "version": "10.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" + }, "engines": { - "node": ">=14" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.4.3", + "version": "0.5.0", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "3.1.1", + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "4.0.1", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/npm/node_modules/@tufjs/canonical-json": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/npm/node_modules/abbrev": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/agent-base": { - "version": "7.1.3", + "version": "7.1.4", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 14" } @@ -37183,70 +32602,51 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", + "version": "2.1.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { - "version": "5.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "cmd-shim": "^7.0.0", - "npm-normalize-package-bin": "^4.0.0", - "proc-log": "^5.0.0", - "read-cmd-shim": "^5.0.0", - "write-file-atomic": "^6.0.0" + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/binary-extensions": { - "version": "2.3.0", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -37257,95 +32657,37 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/npm/node_modules/cacache": { - "version": "19.0.1", + "version": "20.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/fs": "^4.0.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=18" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/chalk": { - "version": "5.4.1", + "version": "5.6.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -37354,17 +32696,16 @@ } }, "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.2.0", + "version": "4.3.1", "dev": true, "funding": [ { @@ -37374,22 +32715,20 @@ ], "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "4.1.3", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { - "ip-regex": "^5.0.0" + "ip-regex": "5.0.0" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/npm/node_modules/cli-columns": { @@ -37397,7 +32736,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" @@ -37407,79 +32745,25 @@ } }, "node_modules/npm/node_modules/cmd-shim": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, "engines": { - "node": ">= 8" + "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "cssesc": "bin/cssesc" }, @@ -37488,11 +32772,10 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.4.1", + "version": "4.4.3", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -37506,28 +32789,19 @@ } }, "node_modules/npm/node_modules/diff": { - "version": "5.2.0", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", @@ -37535,7 +32809,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -37545,7 +32818,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -37554,49 +32826,28 @@ "version": "2.0.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.2", + "version": "3.1.3", "dev": true, "inBundle": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.16", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.3.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm/node_modules/fs-minipass": { "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.3" }, @@ -37605,21 +32856,17 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "10.4.5", + "version": "13.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true, + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -37629,35 +32876,31 @@ "version": "4.2.11", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "8.1.0", + "version": "9.0.2", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/http-cache-semantics": { "version": "4.2.0", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "7.0.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -37671,7 +32914,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -37686,7 +32928,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -37695,16 +32936,15 @@ } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "7.0.0", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "minimatch": "^9.0.0" + "minimatch": "^10.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/imurmurhash": { @@ -37712,50 +32952,42 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } }, "node_modules/npm/node_modules/ini": { - "version": "5.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/init-package-json": { - "version": "7.0.2", + "version": "8.2.4", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/package-json": "^6.0.0", - "npm-package-arg": "^12.0.0", - "promzard": "^2.0.0", - "read": "^4.0.0", - "semver": "^7.3.5", + "@npmcli/package-json": "^7.0.0", + "npm-package-arg": "^13.0.0", + "promzard": "^3.0.1", + "read": "^5.0.1", + "semver": "^7.7.2", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", + "version": "10.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } @@ -37765,7 +32997,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -37774,16 +33005,15 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "5.1.1", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { - "cidr-regex": "^4.1.1" + "cidr-regex": "5.0.1" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/npm/node_modules/is-fullwidth-code-point": { @@ -37791,49 +33021,26 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", + "version": "3.1.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "3.4.3", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "peer": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">=16" } }, - "node_modules/npm/node_modules/jsbn": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/json-stringify-nice": { @@ -37841,7 +33048,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -37853,251 +33059,216 @@ "node >= 0.2.0" ], "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/just-diff": { "version": "6.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "9.0.0", + "version": "10.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "npm-package-arg": "^12.0.0", - "npm-registry-fetch": "^18.0.1" + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "7.0.1", + "version": "8.0.12", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/arborist": "^8.0.1", - "@npmcli/installed-package-contents": "^3.0.0", - "binary-extensions": "^2.3.0", - "diff": "^5.1.0", - "minimatch": "^9.0.4", - "npm-package-arg": "^12.0.0", - "pacote": "^19.0.0", - "tar": "^6.2.1" + "@npmcli/arborist": "^9.1.9", + "@npmcli/installed-package-contents": "^4.0.0", + "binary-extensions": "^3.0.0", + "diff": "^8.0.2", + "minimatch": "^10.0.3", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "tar": "^7.5.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "9.0.1", + "version": "10.1.11", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/arborist": "^8.0.1", - "@npmcli/run-script": "^9.0.1", + "@npmcli/arborist": "^9.1.9", + "@npmcli/package-json": "^7.0.0", + "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", - "npm-package-arg": "^12.0.0", - "pacote": "^19.0.0", - "proc-log": "^5.0.0", - "read": "^4.0.0", - "read-package-json-fast": "^4.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "proc-log": "^6.0.0", + "promise-retry": "^2.0.1", + "read": "^5.0.1", "semver": "^7.3.7", - "walk-up-path": "^3.0.1" + "signal-exit": "^4.1.0", + "walk-up-path": "^4.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^8.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "11.0.0", + "version": "7.0.12", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^18.0.1" + "@npmcli/arborist": "^9.1.9" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "7.0.0", + "version": "8.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^18.0.1" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "8.0.1", + "version": "9.0.12", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/arborist": "^8.0.1", - "@npmcli/run-script": "^9.0.1", - "npm-package-arg": "^12.0.0", - "pacote": "^19.0.0" + "@npmcli/arborist": "^9.1.9", + "@npmcli/run-script": "^10.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "10.0.1", + "version": "11.1.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { + "@npmcli/package-json": "^7.0.0", "ci-info": "^4.0.0", - "normalize-package-data": "^7.0.0", - "npm-package-arg": "^12.0.0", - "npm-registry-fetch": "^18.0.1", - "proc-log": "^5.0.0", + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7", - "sigstore": "^3.0.0", - "ssri": "^12.0.0" + "sigstore": "^4.0.0", + "ssri": "^13.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "8.0.0", + "version": "9.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "npm-registry-fetch": "^18.0.1" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "7.0.0", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^18.0.1" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "7.0.0", + "version": "8.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/git": "^6.0.1", - "@npmcli/run-script": "^9.0.1", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.4.3", + "version": "11.2.2", "dev": true, "inBundle": true, "license": "ISC", - "peer": true + "engines": { + "node": "20 || >=22" + } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "14.0.3", + "version": "15.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", + "@npmcli/agent": "^4.0.0", + "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.5", + "version": "10.1.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true, + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -38108,7 +33279,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -38118,7 +33288,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.3" }, @@ -38127,18 +33296,17 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "4.0.1", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^3.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -38149,7 +33317,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -38162,7 +33329,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -38175,7 +33341,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -38188,7 +33353,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -38201,7 +33365,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -38214,7 +33377,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -38223,11 +33385,10 @@ } }, "node_modules/npm/node_modules/minizlib": { - "version": "3.0.2", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.1.2" }, @@ -38235,287 +33396,200 @@ "node": ">= 18" } }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm/node_modules/ms": { "version": "2.1.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, "node_modules/npm/node_modules/node-gyp": { - "version": "11.2.0", + "version": "12.1.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.4.3", + "tar": "^7.5.2", "tinyglobby": "^0.2.12", - "which": "^5.0.0" + "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=18" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/nopt": { - "version": "8.1.0", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "abbrev": "^3.0.0" + "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-audit-report": { - "version": "6.0.0", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-bundled": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "npm-normalize-package-bin": "^4.0.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "7.1.1", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-package-arg": { - "version": "12.0.2", + "version": "13.0.2", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "9.0.0", + "version": "10.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "ignore-walk": "^7.0.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "10.0.0", + "version": "11.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-profile": { - "version": "11.0.1", + "version": "12.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0" + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "18.0.2", + "version": "19.1.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", + "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-user-validate": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/p-map": { - "version": "7.0.3", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -38523,82 +33597,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/package-json-from-dist": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "peer": true - }, "node_modules/npm/node_modules/pacote": { - "version": "19.0.1", + "version": "21.0.4", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/parse-conflict-json": { - "version": "4.0.0", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "json-parse-even-better-errors": "^4.0.0", + "json-parse-even-better-errors": "^5.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/path-scurry": { - "version": "1.11.1", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -38609,7 +33663,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -38619,23 +33672,21 @@ } }, "node_modules/npm/node_modules/proc-log": { - "version": "5.0.0", + "version": "6.1.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/proggy": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/promise-all-reject-late": { @@ -38643,7 +33694,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -38653,7 +33703,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -38663,7 +33712,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -38673,62 +33721,44 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "2.0.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "read": "^4.0.0" + "read": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", "dev": true, "inBundle": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } }, "node_modules/npm/node_modules/read": { - "version": "4.1.0", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "mute-stream": "^2.0.0" + "mute-stream": "^3.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/read-cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "4.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/retry": { @@ -38736,7 +33766,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -38746,15 +33775,13 @@ "dev": true, "inBundle": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -38762,35 +33789,11 @@ "node": ">=10" } }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/signal-exit": { "version": "4.1.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=14" }, @@ -38799,77 +33802,20 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": { - "version": "2.1.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.0.0", + "@sigstore/tuf": "^4.0.0", + "@sigstore/verify": "^3.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/smart-buffer": { @@ -38877,20 +33823,18 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/npm/node_modules/socks": { - "version": "2.8.5", + "version": "2.8.7", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -38903,7 +33847,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -38918,7 +33861,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -38929,7 +33871,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -38939,45 +33880,34 @@ "version": "2.5.0", "dev": true, "inBundle": true, - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.21", - "dev": true, - "inBundle": true, - "license": "CC0-1.0", - "peer": true - }, - "node_modules/npm/node_modules/sprintf-js": { - "version": "1.1.3", + "version": "3.0.22", "dev": true, "inBundle": true, - "license": "BSD-3-Clause", - "peer": true + "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { - "version": "12.0.0", + "version": "13.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/string-width": { @@ -38985,23 +33915,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -39016,21 +33929,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -39039,122 +33937,62 @@ } }, "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", + "version": "10.2.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/npm/node_modules/tar": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", + "version": "7.5.2", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, + "license": "BlueOak-1.0.0", "dependencies": { - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { + "node_modules/npm/node_modules/tar/node_modules/yallist": { "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/npm/node_modules/text-table": { "version": "0.2.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", + "version": "2.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.14", + "version": "0.2.15", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -39164,11 +34002,13 @@ } }, "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", + "version": "6.5.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -39179,11 +34019,10 @@ } }, "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", + "version": "4.0.3", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -39196,79 +34035,59 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/tuf-js": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" + "@tufjs/models": "4.0.0", + "debug": "^4.4.1", + "make-fetch-happen": "^15.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/unique-filename": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "unique-slug": "^5.0.0" + "unique-slug": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/unique-slug": { - "version": "5.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -39279,35 +34098,34 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "6.0.1", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true + "engines": { + "node": "20 || >=22" + } }, "node_modules/npm/node_modules/which": { - "version": "5.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -39315,146 +34133,27 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "6.0.0", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/yallist": { "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/nth-check": { "version": "2.1.1", @@ -39477,9 +34176,9 @@ "license": "MIT" }, "node_modules/nx": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.1.2.tgz", - "integrity": "sha512-oczAEOOkQHElxCXs2g2jXDRabDRsmub/h5SAgqAUDSJ2CRnYGVVlgZX7l+o+A9kSqfONyLy5FlJ1pSWlvPuG4w==", + "version": "22.3.3", + "resolved": "https://registry.npmjs.org/nx/-/nx-22.3.3.tgz", + "integrity": "sha512-pOxtKWUfvf0oD8Geqs8D89Q2xpstRTaSY+F6Ut/Wd0GnEjUjO32SS1ymAM6WggGPHDZN4qpNrd5cfIxQmAbRLg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -39488,7 +34187,7 @@ "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.2", "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -39499,8 +34198,8 @@ "figures": "3.2.0", "flat": "^5.0.2", "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", + "ignore": "^7.0.5", + "jest-diff": "^30.0.2", "jsonc-parser": "3.2.0", "lines-and-columns": "2.0.3", "minimatch": "9.0.3", @@ -39509,7 +34208,7 @@ "open": "^8.4.0", "ora": "5.3.0", "resolve.exports": "2.0.3", - "semver": "^7.5.3", + "semver": "^7.6.3", "string-width": "^4.2.3", "tar-stream": "~2.2.0", "tmp": "~0.2.1", @@ -39525,16 +34224,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.1.2", - "@nx/nx-darwin-x64": "21.1.2", - "@nx/nx-freebsd-x64": "21.1.2", - "@nx/nx-linux-arm-gnueabihf": "21.1.2", - "@nx/nx-linux-arm64-gnu": "21.1.2", - "@nx/nx-linux-arm64-musl": "21.1.2", - "@nx/nx-linux-x64-gnu": "21.1.2", - "@nx/nx-linux-x64-musl": "21.1.2", - "@nx/nx-win32-arm64-msvc": "21.1.2", - "@nx/nx-win32-x64-msvc": "21.1.2" + "@nx/nx-darwin-arm64": "22.3.3", + "@nx/nx-darwin-x64": "22.3.3", + "@nx/nx-freebsd-x64": "22.3.3", + "@nx/nx-linux-arm-gnueabihf": "22.3.3", + "@nx/nx-linux-arm64-gnu": "22.3.3", + "@nx/nx-linux-arm64-musl": "22.3.3", + "@nx/nx-linux-x64-gnu": "22.3.3", + "@nx/nx-linux-x64-musl": "22.3.3", + "@nx/nx-win32-arm64-msvc": "22.3.3", + "@nx/nx-win32-x64-msvc": "22.3.3" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -39549,6 +34248,19 @@ } } }, + "node_modules/nx/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/nx/node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", @@ -39561,6 +34273,13 @@ "@tybys/wasm-util": "^0.9.0" } }, + "node_modules/nx/node_modules/@sinclair/typebox": { + "version": "0.34.47", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", + "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", + "dev": true, + "license": "MIT" + }, "node_modules/nx/node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", @@ -39571,21 +34290,17 @@ "tslib": "^2.4.0" } }, - "node_modules/nx/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/nx/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/nx/node_modules/cli-cursor": { @@ -39618,6 +34333,16 @@ "dev": true, "license": "MIT" }, + "node_modules/nx/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/nx/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -39680,6 +34405,22 @@ "node": ">=8" } }, + "node_modules/nx/node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/nx/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", @@ -39745,6 +34486,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/nx/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/nx/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/nx/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -39846,7 +34609,6 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -39859,7 +34621,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -39876,7 +34637,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -39896,7 +34656,6 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -40055,16 +34814,16 @@ } }, "node_modules/open": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", - "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "wsl-utils": "^0.1.0" }, "engines": { "node": ">=18" @@ -40247,7 +35006,6 @@ "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -40255,13 +35013,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-event/node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-filter": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-map": "^7.0.1" }, @@ -40324,9 +35110,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -40359,7 +35145,6 @@ "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -40411,7 +35196,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pacote": { @@ -40446,15 +35230,40 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/parent-module": { @@ -40505,7 +35314,6 @@ "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -40541,15 +35349,15 @@ "license": "MIT" }, "node_modules/parse5-html-rewriting-stream": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.1.0.tgz", - "integrity": "sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", "dev": true, "license": "MIT", "dependencies": { "entities": "^6.0.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -40569,9 +35377,9 @@ } }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", "dev": true, "license": "MIT", "dependencies": { @@ -40587,7 +35395,6 @@ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parse5": "^6.0.1" } @@ -40597,17 +35404,16 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.0.0" + "parse5": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -40627,9 +35433,9 @@ } }, "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", "dev": true, "license": "MIT", "dependencies": { @@ -40649,15 +35455,14 @@ "node": ">= 0.8" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", "license": "MIT", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "process": "^0.11.1", + "util": "^0.10.3" } }, "node_modules/path-browserify": { @@ -40667,17 +35472,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -40687,15 +35481,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -40712,28 +35497,29 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } }, "node_modules/path-to-regexp": { "version": "8.3.0", @@ -40755,6 +35541,27 @@ "node": ">=8" } }, + "node_modules/path-unified": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/path-unified/-/path-unified-0.2.0.tgz", + "integrity": "sha512-MNKqvrKbbbb5p7XHXV6ZAsf/1f/yJQa13S/fcX0uua8ew58Tgc6jXV+16JyAbnR/clgCH+euKDxrF2STxMHdrg==", + "license": "MIT" + }, + "node_modules/path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/path/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -40762,16 +35569,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -40818,9 +35615,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -40850,22 +35647,35 @@ } }, "node_modules/piscina": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.2.tgz", - "integrity": "sha512-9cE/BTA/xhDiyNUEj6EKWLEQC17fh/24ydYzQwcA7QdYh75K6kzL2GHvxDF5i9rFGtUaaKk7/u4xp07qiKXccQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", + "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", "dev": true, "license": "MIT", "engines": { "node": ">=20.x" }, "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "@napi-rs/nice": "^1.0.4" + } + }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" } }, "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "dev": true, "license": "MIT", "engines": { @@ -40878,7 +35688,6 @@ "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" @@ -40893,7 +35702,6 @@ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^2.0.0" }, @@ -40907,7 +35715,6 @@ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -40922,7 +35729,6 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^1.0.0" }, @@ -40936,7 +35742,6 @@ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^1.1.0" }, @@ -40950,7 +35755,6 @@ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -40961,7 +35765,6 @@ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -41094,6 +35897,16 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/portfinder": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", @@ -41112,7 +35925,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -41713,9 +36525,9 @@ } }, "node_modules/postcss-loader/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -42533,7 +37345,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -42590,7 +37401,6 @@ "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parse-ms": "^4.0.0" }, @@ -42611,6 +37421,15 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -42700,8 +37519,7 @@ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -42744,7 +37562,7 @@ "url": "https://github.com/sponsors/lupomontero" } }, - "node_modules/punycode": { + "node_modules/psl/node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", @@ -42754,6 +37572,12 @@ "node": ">=6" } }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -42771,10 +37595,9 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -42871,28 +37694,48 @@ } }, "node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.10" } }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "peer": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -42908,8 +37751,7 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", @@ -42917,7 +37759,6 @@ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -42951,42 +37792,41 @@ "license": "MIT" }, "node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz", - "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.6.2" + "@remix-run/router": "1.23.2" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz", - "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.6.2", - "react-router": "6.11.2" + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8", @@ -43004,16 +37844,48 @@ } }, "node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/read-package-up/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { "node": ">=18" @@ -43022,13 +37894,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-package-up/node_modules/type-fest": { + "node_modules/read-package-up/node_modules/parse-json/node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=16" }, @@ -43036,6 +37907,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/read-package-up/node_modules/read-pkg": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz", + "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.2.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/type-fest": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/read-pkg": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", @@ -43269,7 +38189,6 @@ "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, @@ -43528,56 +38447,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/rollup": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", - "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz", + "integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==", "dev": true, "license": "MIT", "dependencies": { @@ -43591,166 +38464,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.5", - "@rollup/rollup-android-arm64": "4.52.5", - "@rollup/rollup-darwin-arm64": "4.52.5", - "@rollup/rollup-darwin-x64": "4.52.5", - "@rollup/rollup-freebsd-arm64": "4.52.5", - "@rollup/rollup-freebsd-x64": "4.52.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", - "@rollup/rollup-linux-arm-musleabihf": "4.52.5", - "@rollup/rollup-linux-arm64-gnu": "4.52.5", - "@rollup/rollup-linux-arm64-musl": "4.52.5", - "@rollup/rollup-linux-loong64-gnu": "4.52.5", - "@rollup/rollup-linux-ppc64-gnu": "4.52.5", - "@rollup/rollup-linux-riscv64-gnu": "4.52.5", - "@rollup/rollup-linux-riscv64-musl": "4.52.5", - "@rollup/rollup-linux-s390x-gnu": "4.52.5", - "@rollup/rollup-linux-x64-gnu": "4.52.5", - "@rollup/rollup-linux-x64-musl": "4.52.5", - "@rollup/rollup-openharmony-arm64": "4.52.5", - "@rollup/rollup-win32-arm64-msvc": "4.52.5", - "@rollup/rollup-win32-ia32-msvc": "4.52.5", - "@rollup/rollup-win32-x64-gnu": "4.52.5", - "@rollup/rollup-win32-x64-msvc": "4.52.5", + "@rollup/rollup-android-arm-eabi": "4.53.2", + "@rollup/rollup-android-arm64": "4.53.2", + "@rollup/rollup-darwin-arm64": "4.53.2", + "@rollup/rollup-darwin-x64": "4.53.2", + "@rollup/rollup-freebsd-arm64": "4.53.2", + "@rollup/rollup-freebsd-x64": "4.53.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", + "@rollup/rollup-linux-arm-musleabihf": "4.53.2", + "@rollup/rollup-linux-arm64-gnu": "4.53.2", + "@rollup/rollup-linux-arm64-musl": "4.53.2", + "@rollup/rollup-linux-loong64-gnu": "4.53.2", + "@rollup/rollup-linux-ppc64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-musl": "4.53.2", + "@rollup/rollup-linux-s390x-gnu": "4.53.2", + "@rollup/rollup-linux-x64-gnu": "4.53.2", + "@rollup/rollup-linux-x64-musl": "4.53.2", + "@rollup/rollup-openharmony-arm64": "4.53.2", + "@rollup/rollup-win32-arm64-msvc": "4.53.2", + "@rollup/rollup-win32-ia32-msvc": "4.53.2", + "@rollup/rollup-win32-x64-gnu": "4.53.2", + "@rollup/rollup-win32-x64-msvc": "4.53.2", "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-copy": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", - "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^8.0.1", - "colorette": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "10.0.1", - "is-plain-object": "^3.0.0" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/rollup-plugin-copy/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rollup-plugin-copy/node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup-plugin-copy/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/rollup-plugin-copy/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup-plugin-copy/node_modules/globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-copy/node_modules/is-plain-object": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rollup-plugin-copy/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/rollup-plugin-copy/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rollup-plugin-copy/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/rollup-plugin-dts": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.2.3.tgz", @@ -43802,23 +38540,6 @@ "postcss": "8.x" } }, - "node_modules/rollup-plugin-postcss/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/rollup-plugin-postcss/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -43873,6 +38594,19 @@ "node": ">=8.0.0" } }, + "node_modules/rollup-plugin-postcss/node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/rollup-plugin-postcss/node_modules/cssnano": { "version": "5.1.15", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", @@ -44656,13 +39390,6 @@ "dev": true, "license": "MIT" }, - "node_modules/rslog": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.3.0.tgz", - "integrity": "sha512-93DpwwaiRrLz7fJ5z6Uwb171hHBws1VVsWjU6IruLFX63BicLA44QNu0sfn3guKHnBHZMFSKO8akfx5QhjuegQ==", - "dev": true, - "license": "MIT" - }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -44752,7 +39479,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -44804,7 +39530,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -44838,52 +39563,6 @@ "rimraf": "^2.5.2" } }, - "node_modules/sander/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/sander/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sander/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/sander/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -44899,9 +39578,9 @@ } }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -44920,9 +39599,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.93.2.tgz", - "integrity": "sha512-FvQdkn2dZ8DGiLgi0Uf4zsj7r/BsiLImNa5QJ10eZalY6NfZyjrmWGFcuCN5jNwlDlXFJnftauv+UtvBKLvepQ==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.97.2.tgz", + "integrity": "sha512-lKJcskySwAtJ4QRirKrikrWMFa2niAuaGenY2ElHjd55IwHUiur5IdKu6R1hEmGYMs4Qm+6rlRW0RvuAkmcryg==", "dev": true, "license": "MIT", "dependencies": { @@ -44942,30 +39621,30 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-all-unknown": "1.93.2", - "sass-embedded-android-arm": "1.93.2", - "sass-embedded-android-arm64": "1.93.2", - "sass-embedded-android-riscv64": "1.93.2", - "sass-embedded-android-x64": "1.93.2", - "sass-embedded-darwin-arm64": "1.93.2", - "sass-embedded-darwin-x64": "1.93.2", - "sass-embedded-linux-arm": "1.93.2", - "sass-embedded-linux-arm64": "1.93.2", - "sass-embedded-linux-musl-arm": "1.93.2", - "sass-embedded-linux-musl-arm64": "1.93.2", - "sass-embedded-linux-musl-riscv64": "1.93.2", - "sass-embedded-linux-musl-x64": "1.93.2", - "sass-embedded-linux-riscv64": "1.93.2", - "sass-embedded-linux-x64": "1.93.2", - "sass-embedded-unknown-all": "1.93.2", - "sass-embedded-win32-arm64": "1.93.2", - "sass-embedded-win32-x64": "1.93.2" + "sass-embedded-all-unknown": "1.97.2", + "sass-embedded-android-arm": "1.97.2", + "sass-embedded-android-arm64": "1.97.2", + "sass-embedded-android-riscv64": "1.97.2", + "sass-embedded-android-x64": "1.97.2", + "sass-embedded-darwin-arm64": "1.97.2", + "sass-embedded-darwin-x64": "1.97.2", + "sass-embedded-linux-arm": "1.97.2", + "sass-embedded-linux-arm64": "1.97.2", + "sass-embedded-linux-musl-arm": "1.97.2", + "sass-embedded-linux-musl-arm64": "1.97.2", + "sass-embedded-linux-musl-riscv64": "1.97.2", + "sass-embedded-linux-musl-x64": "1.97.2", + "sass-embedded-linux-riscv64": "1.97.2", + "sass-embedded-linux-x64": "1.97.2", + "sass-embedded-unknown-all": "1.97.2", + "sass-embedded-win32-arm64": "1.97.2", + "sass-embedded-win32-x64": "1.97.2" } }, "node_modules/sass-embedded-all-unknown": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.93.2.tgz", - "integrity": "sha512-GdEuPXIzmhRS5J7UKAwEvtk8YyHQuFZRcpnEnkA3rwRUI27kwjyXkNeIj38XjUQ3DzrfMe8HcKFaqWGHvblS7Q==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.2.tgz", + "integrity": "sha512-Fj75+vOIDv1T/dGDwEpQ5hgjXxa2SmMeShPa8yrh2sUz1U44bbmY4YSWPCdg8wb7LnwiY21B2KRFM+HF42yO4g==", "cpu": [ "!arm", "!arm64", @@ -44976,13 +39655,13 @@ "license": "MIT", "optional": true, "dependencies": { - "sass": "1.93.2" + "sass": "1.97.2" } }, "node_modules/sass-embedded-all-unknown/node_modules/sass": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", - "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", + "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "dev": true, "license": "MIT", "optional": true, @@ -45002,9 +39681,9 @@ } }, "node_modules/sass-embedded-android-arm": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.93.2.tgz", - "integrity": "sha512-I8bpO8meZNo5FvFx5FIiE7DGPVOYft0WjuwcCCdeJ6duwfkl6tZdatex1GrSigvTsuz9L0m4ngDcX/Tj/8yMow==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.2.tgz", + "integrity": "sha512-BPT9m19ttY0QVHYYXRa6bmqmS3Fa2EHByNUEtSVcbm5PkIk1ntmYkG9fn5SJpIMbNmFDGwHx+pfcZMmkldhnRg==", "cpu": [ "arm" ], @@ -45019,9 +39698,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.93.2.tgz", - "integrity": "sha512-346f4iVGAPGcNP6V6IOOFkN5qnArAoXNTPr5eA/rmNpeGwomdb7kJyQ717r9rbJXxOG8OAAUado6J0qLsjnjXQ==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.2.tgz", + "integrity": "sha512-pF6I+R5uThrscd3lo9B3DyNTPyGFsopycdx0tDAESN6s+dBbiRgNgE4Zlpv50GsLocj/lDLCZaabeTpL3ubhYA==", "cpu": [ "arm64" ], @@ -45036,9 +39715,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.93.2.tgz", - "integrity": "sha512-hSMW1s4yJf5guT9mrdkumluqrwh7BjbZ4MbBW9tmi1DRDdlw1Wh9Oy1HnnmOG8x9XcI1qkojtPL6LUuEJmsiDg==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.2.tgz", + "integrity": "sha512-fprI8ZTJdz+STgARhg8zReI2QhhGIT9G8nS7H21kc3IkqPRzhfaemSxEtCqZyvDbXPcgYiDLV7AGIReHCuATog==", "cpu": [ "riscv64" ], @@ -45053,9 +39732,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.93.2.tgz", - "integrity": "sha512-JqktiHZduvn+ldGBosE40ALgQ//tGCVNAObgcQ6UIZznEJbsHegqStqhRo8UW3x2cgOO2XYJcrInH6cc7wdKbw==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.2.tgz", + "integrity": "sha512-RswwSjURZxupsukEmNt2t6RGvuvIw3IAD5sDq1Pc65JFvWFY3eHqCmH0lG0oXqMg6KJcF0eOxHOp2RfmIm2+4w==", "cpu": [ "x64" ], @@ -45070,9 +39749,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.93.2.tgz", - "integrity": "sha512-qI1X16qKNeBJp+M/5BNW7v/JHCDYWr1/mdoJ7+UMHmP0b5AVudIZtimtK0hnjrLnBECURifd6IkulybR+h+4UA==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.2.tgz", + "integrity": "sha512-xcsZNnU1XZh21RE/71OOwNqPVcGBU0qT9A4k4QirdA34+ts9cDIaR6W6lgHOBR/Bnnu6w6hXJR4Xth7oFrefPA==", "cpu": [ "arm64" ], @@ -45087,9 +39766,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.93.2.tgz", - "integrity": "sha512-4KeAvlkQ0m0enKUnDGQJZwpovYw99iiMb8CTZRSsQm8Eh7halbJZVmx67f4heFY/zISgVOCcxNg19GrM5NTwtA==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.2.tgz", + "integrity": "sha512-T/9DTMpychm6+H4slHCAsYJRJ6eM+9H9idKlBPliPrP4T8JdC2Cs+ZOsYqrObj6eOtAD0fGf+KgyNhnW3xVafA==", "cpu": [ "x64" ], @@ -45104,9 +39783,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.93.2.tgz", - "integrity": "sha512-N3+D/ToHtzwLDO+lSH05Wo6/KRxFBPnbjVHASOlHzqJnK+g5cqex7IFAp6ozzlRStySk61Rp6d+YGrqZ6/P0PA==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.2.tgz", + "integrity": "sha512-yDRe1yifGHl6kibkDlRIJ2ZzAU03KJ1AIvsAh4dsIDgK5jx83bxZLV1ZDUv7a8KK/iV/80LZnxnu/92zp99cXQ==", "cpu": [ "arm" ], @@ -45121,9 +39800,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.93.2.tgz", - "integrity": "sha512-9ftX6nd5CsShJqJ2WRg+ptaYvUW+spqZfJ88FbcKQBNFQm6L87luj3UI1rB6cP5EWrLwHA754OKxRJyzWiaN6g==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.2.tgz", + "integrity": "sha512-Wh+nQaFer9tyE5xBPv5murSUZE/+kIcg8MyL5uqww6be9Iq+UmZpcJM7LUk+q8klQ9LfTmoDSNFA74uBqxD6IA==", "cpu": [ "arm64" ], @@ -45138,9 +39817,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.93.2.tgz", - "integrity": "sha512-XBTvx66yRenvEsp3VaJCb3HQSyqCsUh7R+pbxcN5TuzueybZi0LXvn9zneksdXcmjACMlMpIVXi6LyHPQkYc8A==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.2.tgz", + "integrity": "sha512-GIO6xfAtahJAWItvsXZ3MD1HM6s8cKtV1/HL088aUpKJaw/2XjTCveiOO2AdgMpLNztmq9DZ1lx5X5JjqhS45g==", "cpu": [ "arm" ], @@ -45155,9 +39834,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.93.2.tgz", - "integrity": "sha512-+3EHuDPkMiAX5kytsjEC1bKZCawB9J6pm2eBIzzLMPWbf5xdx++vO1DpT7hD4bm4ZGn0eVHgSOKIfP6CVz6tVg==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.2.tgz", + "integrity": "sha512-NfUqZSjHwnHvpSa7nyNxbWfL5obDjNBqhHUYmqbHUcmqBpFfHIQsUPgXME9DKn1yBlBc3mWnzMxRoucdYTzd2Q==", "cpu": [ "arm64" ], @@ -45172,9 +39851,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.93.2.tgz", - "integrity": "sha512-0sB5kmVZDKTYzmCSlTUnjh6mzOhzmQiW/NNI5g8JS4JiHw2sDNTvt1dsFTuqFkUHyEOY3ESTsfHHBQV8Ip4bEA==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.2.tgz", + "integrity": "sha512-qtM4dJ5gLfvyTZ3QencfNbsTEShIWImSEpkThz+Y2nsCMbcMP7/jYOA03UWgPfEOKSehQQ7EIau7ncbFNoDNPQ==", "cpu": [ "riscv64" ], @@ -45189,9 +39868,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.93.2.tgz", - "integrity": "sha512-t3ejQ+1LEVuHy7JHBI2tWHhoMfhedUNDjGJR2FKaLgrtJntGnyD1RyX0xb3nuqL/UXiEAtmTmZY+Uh3SLUe1Hg==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.2.tgz", + "integrity": "sha512-ZAxYOdmexcnxGnzdsDjYmNe3jGj+XW3/pF/n7e7r8y+5c6D2CQRrCUdapLgaqPt1edOPQIlQEZF8q5j6ng21yw==", "cpu": [ "x64" ], @@ -45206,9 +39885,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.93.2.tgz", - "integrity": "sha512-e7AndEwAbFtXaLy6on4BfNGTr3wtGZQmypUgYpSNVcYDO+CWxatKVY4cxbehMPhxG9g5ru+eaMfynvhZt7fLaA==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.2.tgz", + "integrity": "sha512-reVwa9ZFEAOChXpDyNB3nNHHyAkPMD+FTctQKECqKiVJnIzv2EaFF6/t0wzyvPgBKeatA8jszAIeOkkOzbYVkQ==", "cpu": [ "riscv64" ], @@ -45223,9 +39902,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.93.2.tgz", - "integrity": "sha512-U3EIUZQL11DU0xDDHXexd4PYPHQaSQa2hzc4EzmhHqrAj+TyfYO94htjWOd+DdTPtSwmLp+9cTWwPZBODzC96w==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.2.tgz", + "integrity": "sha512-bvAdZQsX3jDBv6m4emaU2OMTpN0KndzTAMgJZZrKUgiC0qxBmBqbJG06Oj/lOCoXGCxAvUOheVYpezRTF+Feog==", "cpu": [ "x64" ], @@ -45240,9 +39919,9 @@ } }, "node_modules/sass-embedded-unknown-all": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.93.2.tgz", - "integrity": "sha512-7VnaOmyewcXohiuoFagJ3SK5ddP9yXpU0rzz+pZQmS1/+5O6vzyFCUoEt3HDRaLctH4GT3nUGoK1jg0ae62IfQ==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.2.tgz", + "integrity": "sha512-86tcYwohjPgSZtgeU9K4LikrKBJNf8ZW/vfsFbdzsRlvc73IykiqanufwQi5qIul0YHuu9lZtDWyWxM2dH/Rsg==", "dev": true, "license": "MIT", "optional": true, @@ -45253,13 +39932,13 @@ "!win32" ], "dependencies": { - "sass": "1.93.2" + "sass": "1.97.2" } }, "node_modules/sass-embedded-unknown-all/node_modules/sass": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", - "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", + "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "dev": true, "license": "MIT", "optional": true, @@ -45279,9 +39958,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.93.2.tgz", - "integrity": "sha512-Y90DZDbQvtv4Bt0GTXKlcT9pn4pz8AObEjFF8eyul+/boXwyptPZ/A1EyziAeNaIEIfxyy87z78PUgCeGHsx3Q==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.2.tgz", + "integrity": "sha512-Cv28q8qNjAjZfqfzTrQvKf4JjsZ6EOQ5FxyHUQQeNzm73R86nd/8ozDa1Vmn79Hq0kwM15OCM9epanDuTG1ksA==", "cpu": [ "arm64" ], @@ -45296,9 +39975,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.93.2.tgz", - "integrity": "sha512-BbSucRP6PVRZGIwlEBkp+6VQl2GWdkWFMN+9EuOTPrLxCJZoq+yhzmbjspd3PeM8+7WJ7AdFu/uRYdO8tor1iQ==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.2.tgz", + "integrity": "sha512-DVxLxkeDCGIYeyHLAvWW3yy9sy5Ruk5p472QWiyfyyG1G1ASAR8fgfIY5pT0vE6Rv+VAKVLwF3WTspUYu7S1/Q==", "cpu": [ "x64" ], @@ -45370,11 +40049,11 @@ } }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "optional": true }, "node_modules/saxes": { @@ -45487,18 +40166,17 @@ } }, "node_modules/semantic-release": { - "version": "23.1.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.1.1.tgz", - "integrity": "sha512-qqJDBhbtHsjUEMsojWKGuL5lQFCJuPtiXKEIlFKyTzDDGTAE/oyvznaP8GeOr5PvcqBJ6LQz4JCENWPLeehSpA==", + "version": "25.0.2", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.2.tgz", + "integrity": "sha512-6qGjWccl5yoyugHt3jTgztJ9Y0JVzyH8/Voc/D8PlLat9pwxQYXz7W1Dpnq5h0/G5GCYGUaDSlYcyk3AMh5A6g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@semantic-release/commit-analyzer": "^12.0.0", + "@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^10.0.0", - "@semantic-release/npm": "^12.0.0", - "@semantic-release/release-notes-generator": "^13.0.0", + "@semantic-release/github": "^12.0.0", + "@semantic-release/npm": "^13.1.1", + "@semantic-release/release-notes-generator": "^14.1.0", "aggregate-error": "^5.0.0", "cosmiconfig": "^9.0.0", "debug": "^4.0.0", @@ -45508,42 +40186,42 @@ "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^7.0.0", - "import-from-esm": "^1.3.1", + "hook-std": "^4.0.0", + "hosted-git-info": "^9.0.0", + "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", - "marked": "^12.0.0", - "marked-terminal": "^7.0.0", + "marked": "^15.0.0", + "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", - "read-package-up": "^11.0.0", + "read-package-up": "^12.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", - "semver-diff": "^4.0.0", + "semver-diff": "^5.0.0", "signale": "^1.2.1", - "yargs": "^17.5.1" + "yargs": "^18.0.0" }, "bin": { "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=20.8.1" + "node": "^22.14.0 || >= 24.10.0" } }, "node_modules/semantic-release/node_modules/@semantic-release/commit-analyzer": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-12.0.0.tgz", - "integrity": "sha512-qG+md5gdes+xa8zP7lIo1fWE17zRdO8yMCaxh9lyL65TQleoSv8WHHOqRURfghTytUh+NpkSyBprQ5hrkxOKVQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", + "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-filter": "^4.0.0", - "conventional-commits-parser": "^5.0.0", + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", - "import-from-esm": "^1.0.3", + "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", "micromatch": "^4.0.2" }, @@ -45555,23 +40233,22 @@ } }, "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-13.0.0.tgz", - "integrity": "sha512-LEeZWb340keMYuREMyxrODPXJJ0JOL8D/mCl74B4LdzbxhtXV2LrPN2QBEcGJrlQhoqLO0RhxQb6masHytKw+A==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.0.tgz", + "integrity": "sha512-CcyDRk7xq+ON/20YNR+1I/jP7BYKICr1uKd1HHpROSnnTdGqOTburi4jcRiTYz0cpfhxSloQO3cGhnoot7IEkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "conventional-changelog-angular": "^7.0.0", - "conventional-changelog-writer": "^7.0.0", - "conventional-commits-filter": "^4.0.0", - "conventional-commits-parser": "^5.0.0", + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", "get-stream": "^7.0.0", - "import-from-esm": "^1.0.3", + "import-from-esm": "^2.0.0", "into-stream": "^7.0.0", "lodash-es": "^4.17.21", - "read-pkg-up": "^11.0.0" + "read-package-up": "^11.0.0" }, "engines": { "node": ">=20.8.1" @@ -45586,7 +40263,6 @@ "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16" }, @@ -45594,13 +40270,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, "engines": { "node": ">=18" }, @@ -45608,13 +40288,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/conventional-changelog-angular": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", + "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semantic-release/node_modules/conventional-changelog-writer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz", + "integrity": "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^5.0.0", + "handlebars": "^4.7.7", + "meow": "^13.0.0", + "semver": "^7.5.2" + }, + "bin": { + "conventional-changelog-writer": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semantic-release/node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/semantic-release/node_modules/conventional-commits-parser": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", + "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/semantic-release/node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -45636,21 +40373,12 @@ } } }, - "node_modules/semantic-release/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/semantic-release/node_modules/execa": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", @@ -45678,7 +40406,6 @@ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -45696,7 +40423,6 @@ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -45713,7 +40439,6 @@ "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "semver-regex": "^4.0.5", "super-regex": "^1.0.0" @@ -45725,40 +40450,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/semantic-release/node_modules/human-signals": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18.0" } }, - "node_modules/semantic-release/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/semantic-release/node_modules/import-from-esm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz", + "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18.20" } }, "node_modules/semantic-release/node_modules/is-plain-obj": { @@ -45767,7 +40480,6 @@ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -45781,7 +40493,6 @@ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -45790,12 +40501,11 @@ } }, "node_modules/semantic-release/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -45803,13 +40513,18 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/semantic-release/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/semantic-release/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, - "license": "ISC", - "peer": true + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/semantic-release/node_modules/npm-run-path": { "version": "6.0.0", @@ -45817,7 +40532,6 @@ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" @@ -45835,7 +40549,6 @@ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -45843,29 +40556,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/semantic-release/node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -45873,13 +40569,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/unicorn-magic": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -45887,26 +40595,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -45920,12 +40608,12 @@ } }, "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-5.0.0.tgz", + "integrity": "sha512-0HbGtOm+S7T6NGQ/pxJSJipJvc4DK3FcRVMRkhsIwJDJ4Jcz5DQC1cPPzB5GhzyHjwttW878HaWQq46CkL3cqg==", + "deprecated": "Deprecated as the semver package now supports this built-in.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "semver": "^7.3.5" }, @@ -45966,38 +40654,51 @@ } }, "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "node_modules/send/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serialize-javascript": { @@ -46144,9 +40845,9 @@ } }, "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, "license": "MIT", "dependencies": { @@ -46157,13 +40858,16 @@ }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -46232,7 +40936,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -46245,7 +40948,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -46268,7 +40970,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -46288,7 +40989,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -46305,7 +41005,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -46324,7 +41023,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -46351,7 +41049,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -46366,7 +41063,6 @@ "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.3.2", "figures": "^2.0.0", @@ -46382,7 +41078,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -46396,7 +41091,6 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -46412,7 +41106,6 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -46422,8 +41115,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/signale/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -46431,7 +41123,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -46442,7 +41133,6 @@ "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -46456,7 +41146,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -46467,7 +41156,6 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -46521,7 +41209,6 @@ "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -46739,7 +41426,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -46750,7 +41437,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -46761,8 +41448,7 @@ "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/spdx-correct": { "version": "3.2.0", @@ -46963,13 +41649,21 @@ "node": ">= 0.4" } }, + "node_modules/stream": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.3.tgz", + "integrity": "sha512-aMsbn7VKrl4A2T7QAQQbzgN7NVc70vgF5INQrBXqn4dCXN1zy3L9HGgLO5s7PExmdrzTJ8uR/27aviW8or8/+A==", + "license": "MIT", + "dependencies": { + "component-emitter": "^2.0.0" + } + }, "node_modules/stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" @@ -47086,7 +41780,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -47105,7 +41798,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -47120,14 +41812,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -47137,7 +41827,6 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -47150,7 +41839,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -47281,7 +41969,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -47345,26 +42032,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -47400,69 +42067,62 @@ } }, "node_modules/style-dictionary": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/style-dictionary/-/style-dictionary-3.9.2.tgz", - "integrity": "sha512-M2pcQ6hyRtqHOh+NyT6T05R3pD/gwNpuhREBKvxC1En0vyywx+9Wy9nXWT1SZ9ePzv1vAo65ItnpA16tT9ZUCg==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/style-dictionary/-/style-dictionary-5.1.1.tgz", + "integrity": "sha512-scRFwr2VrerXy6BzO2Ym8AI0dRGkAIoS2YhooagytxCFkoXPYCLhvIxg3VO/yD2i4VeU4aGmHG80+ZLdPDb0uw==", "license": "Apache-2.0", "dependencies": { - "chalk": "^4.0.0", - "change-case": "^4.1.2", - "commander": "^8.3.0", - "fs-extra": "^10.0.0", - "glob": "^10.3.10", + "@bundled-es-modules/deepmerge": "^4.3.1", + "@bundled-es-modules/glob": "^11.0.3", + "@bundled-es-modules/memfs": "^4.9.4", + "@zip.js/zip.js": "^2.7.44", + "chalk": "^5.3.0", + "change-case": "^5.3.0", + "commander": "^12.1.0", + "is-plain-obj": "^4.1.0", "json5": "^2.2.2", - "jsonc-parser": "^3.0.0", - "lodash": "^4.17.15", - "tinycolor2": "^1.4.1" + "path-unified": "^0.2.0", + "prettier": "^3.3.3", + "tinycolor2": "^1.6.0" }, "bin": { - "style-dictionary": "bin/style-dictionary" + "style-dictionary": "bin/style-dictionary.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=22.0.0" } }, "node_modules/style-dictionary/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/style-dictionary/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=18" } }, - "node_modules/style-dictionary/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, + "node_modules/style-dictionary/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/style-inject": { @@ -47507,14 +42167,14 @@ } }, "node_modules/super-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", - "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "function-timeout": "^1.0.1", + "make-asynchronous": "^1.0.1", "time-span": "^5.1.0" }, "engines": { @@ -47542,7 +42202,6 @@ "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -47753,6 +42412,12 @@ } } }, + "node_modules/svelte-routing": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/svelte-routing/-/svelte-routing-2.13.0.tgz", + "integrity": "sha512-/NTxqTwLc7Dq306hARJrH2HLXOBtKd7hu8nxgoFDlK0AC4SOKnzisiX/9m8Uksei1QAWtlAEdF91YphNM8iDMg==", + "license": "MIT" + }, "node_modules/svelte/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -47816,6 +42481,36 @@ "node": ">= 10" } }, + "node_modules/svgo/node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/swc-loader": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.1.15.tgz", @@ -47875,6 +42570,35 @@ "node": ">=16.0.0" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -47919,21 +42643,6 @@ "streamx": "^2.15.0" } }, - "node_modules/tar-stream/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -48023,7 +42732,6 @@ "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=14.16" } @@ -48034,7 +42742,6 @@ "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-stream": "^3.0.0", "temp-dir": "^3.0.0", @@ -48054,7 +42761,6 @@ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -48068,7 +42774,6 @@ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=12.20" }, @@ -48096,9 +42801,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -48169,34 +42874,39 @@ "license": "MIT" }, "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=18" + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/text-decoder": { @@ -48209,21 +42919,6 @@ "b4a": "^1.6.4" } }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/text-extensions": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", @@ -48250,7 +42945,6 @@ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "any-promise": "^1.0.0" } @@ -48261,7 +42955,6 @@ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -48273,7 +42966,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.18" @@ -48298,7 +42990,6 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -48317,7 +43008,6 @@ "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "convert-hrtime": "^5.0.0" }, @@ -48339,7 +43029,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "dev": true, "license": "MIT" }, "node_modules/tinyexec": { @@ -48350,59 +43039,26 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "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.5.0", - "picomatch": "^4.0.3" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyspy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -48521,13 +43177,22 @@ "node": ">=18" } }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/traverse": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -48539,7 +43204,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -48576,17 +43240,17 @@ } }, "node_modules/ts-checker-rspack-plugin": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.6.tgz", - "integrity": "sha512-DjSnkHzPMQegh8FHOKXFx3u5yCO8U9Mt0EubJBcEFd95rcgo9Xs1FWREeFX3iFMCF8hFyAFVitvkruR4iwH31g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.2.3.tgz", + "integrity": "sha512-Fq2+/sSILEJKWrqoj/H+ytnBbYrudPfRLxaULA/MuL+/3jswXuiR4MOfL30R9XzVUD2km0pSx6bj8yk95IEOaA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@rspack/lite-tapable": "^1.0.1", + "@rspack/lite-tapable": "^1.1.0", "chokidar": "^3.6.0", "is-glob": "^4.0.3", - "memfs": "^4.47.0", + "memfs": "^4.51.1", "minimatch": "^9.0.5", "picocolors": "^1.1.1" }, @@ -48639,9 +43303,9 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/memfs": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.49.0.tgz", - "integrity": "sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ==", + "version": "4.51.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", + "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -48700,9 +43364,9 @@ } }, "node_modules/ts-jest": { - "version": "29.4.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz", - "integrity": "sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { @@ -48799,23 +43463,6 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -48889,23 +43536,6 @@ "node": ">=10.13.0" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -48946,6 +43576,16 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -49084,6 +43724,7 @@ "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", @@ -49157,10 +43798,45 @@ "through": "^2.3.8" } }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/undici": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -49178,7 +43854,6 @@ "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -49271,7 +43946,6 @@ "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -49287,8 +43961,7 @@ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/universalify": { "version": "2.0.1", @@ -49309,6 +43982,41 @@ "node": ">= 0.8" } }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/upath": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", @@ -49321,9 +44029,9 @@ } }, "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==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -49350,682 +44058,245 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "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": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-dts": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", - "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor": "^7.50.1", - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.11", - "@vue/language-core": "2.2.0", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17" - }, - "peerDependencies": { - "typescript": "*", - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "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==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10.12.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "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": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, - "hasInstallScript": true, "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, "bin": { - "esbuild": "bin/esbuild" + "vite": "bin/vite.js" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, "node_modules/vitefu": { @@ -50044,41 +44315,38 @@ } }, "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.9.tgz", + "integrity": "sha512-E0Ja2AX4th+CG33yAFRC+d1wFx2pzU5r6HtG6LiPSE04flaE0qB6YyjSw9ZcpJAtVPfsvZGtJlKWZpuW7EHRxg==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", + "@vitest/expect": "4.0.9", + "@vitest/mocker": "4.0.9", + "@vitest/pretty-format": "4.0.9", + "@vitest/runner": "4.0.9", + "@vitest/snapshot": "4.0.9", + "@vitest/spy": "4.0.9", + "@vitest/utils": "4.0.9", + "debug": "^4.4.3", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -50086,9 +44354,11 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.9", + "@vitest/browser-preview": "4.0.9", + "@vitest/browser-webdriverio": "4.0.9", + "@vitest/ui": "4.0.9", "happy-dom": "*", "jsdom": "*" }, @@ -50102,7 +44372,13 @@ "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { "optional": true }, "@vitest/ui": { @@ -50226,6 +44502,182 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.9.tgz", + "integrity": "sha512-PUyaowQFHW+9FKb4dsvvBM4o025rWMlEDXdWRxIOilGaHREYTi5Q2Rt9VCgXgPy/hHZu1LeuXtrA/GdzOatP2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/@vitest/pretty-format": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.9.tgz", + "integrity": "sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/spy": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.9.tgz", + "integrity": "sha512-J9Ttsq0hDXmxmT8CUOWUr1cqqAj2FJRGTdyEjSR+NjoOGKEqkEWj+09yC0HhI8t1W6t4Ctqawl1onHgipJve1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/utils": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.9.tgz", + "integrity": "sha512-cEol6ygTzY4rUPvNZM19sDf7zGa35IYTm9wfzkHoT/f5jX10IOY7QleWSOh5T0e3I3WVozwK5Asom79qW8DiuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.9", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/vitest/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/vitest/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", + "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.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/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", @@ -50308,6 +44760,13 @@ "license": "MIT", "optional": true }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -50319,9 +44778,9 @@ } }, "node_modules/webpack": { - "version": "5.102.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", - "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", + "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", "dev": true, "license": "MIT", "dependencies": { @@ -50333,7 +44792,7 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.26.3", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", @@ -50345,10 +44804,10 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.4", + "watchpack": "^2.4.1", "webpack-sources": "^3.3.3" }, "bin": { @@ -50398,9 +44857,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/memfs": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.49.0.tgz", - "integrity": "sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz", + "integrity": "sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -50512,30 +44971,61 @@ } }, "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/webpack-dev-server/node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server/node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -50561,16 +45051,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/webpack-dev-server/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/webpack-dev-server/node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -50596,40 +45076,40 @@ "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -50818,34 +45298,49 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webpack-dev-server/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "node_modules/webpack-dev-server/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/webpack-dev-server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/webpack-dev-server/node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server/node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -51128,7 +45623,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -51218,7 +45712,6 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -51297,7 +45790,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -51315,14 +45807,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -51332,7 +45822,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -51422,6 +45911,22 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -51445,7 +45950,6 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4" } @@ -51476,15 +45980,19 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -51675,7 +46183,6 @@ "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -51697,9 +46204,9 @@ } }, "node_modules/zod": { - "version": "3.25.75", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.75.tgz", - "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "dev": true, "license": "MIT", "funding": { @@ -51707,13 +46214,13 @@ } }, "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", "dev": true, "license": "ISC", "peerDependencies": { - "zod": "^3.24.1" + "zod": "^3.25 || ^4" } }, "node_modules/zone.js": { diff --git a/package.json b/package.json index 9c5a59cc89..49c2eca588 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,15 @@ "version": "0.0.0", "license": "Apache-2.0", "scripts": { - "serve:web": "nx run web:serve:development", - "serve:react": "nx run react:serve:development", - "serve:angular": "nx run angular:serve:development", + "serve:dev:web": "nx run web-dev:serve:development", + "serve:dev:react": "nx run react-dev:serve:development", + "serve:dev:angular": "nx run angular-dev:serve:development", + "serve:prs:web": "nx run web-prs:serve:development", + "serve:prs:react": "nx run react-prs:serve:development", + "serve:prs:angular": "nx run angular-prs:serve:development", "dev:watch": "vite build --watch libs/web-components", - "build": "nx affected --base=dev -t build --exclude=apps/* --exclude=playground/*", - "build:prod": "nx run-many -t build --all --prod --exclude=apps/* --exclude=playground/*", + "build": "nx affected --base=dev -t build --exclude=apps/dev/**/*", + "build:prod": "nx run-many -t build --all --prod --exclude=apps/dev/**/*", "build:vscode-doc": "node libs/web-components/custom-element-manifest-analyze.js", "pretest:pr": "npx nx run common:build && npx nx run web-components:build && npx nx run react-components:build", "test:pr": "vitest --run --project=*-unit && vitest --run --project=*-headless && nx test angular-components", @@ -18,34 +21,34 @@ "test:angular": "nx test angular-components", "lint": "nx run-many --target=lint --exclude=angular --exclude=react --exclude=web", "validate": "npm run build && npm run lint && vitest --run", - "pg:setup": "./scripts/pg-setup", - "pg:switch": "./scripts/pg-switch" + "dev:setup": "bash ./scripts/dev-setup" }, "private": true, "devDependencies": { - "@abgov/design-tokens": "^1.6.0", + "@abgov/design-tokens": "^1.8.0", "@abgov/nx-release": "^10.0.0", - "@angular-devkit/build-angular": "20.1.5", + "@angular-devkit/build-angular": "^20.3.10", "@angular-devkit/core": "20.1.5", "@angular-devkit/schematics": "20.1.5", "@angular-eslint/eslint-plugin": "18.0.1", "@angular-eslint/eslint-plugin-template": "18.0.1", "@angular-eslint/template-parser": "18.0.1", - "@angular/cli": "~20.1.5", + "@angular/cli": "^20.3.13", "@angular/compiler-cli": "20.1.6", "@angular/language-service": "20.1.6", "@babel/core": "^7.14.5", "@babel/preset-react": "^7.14.5", "@faker-js/faker": "^8.3.1", - "@nx/angular": "21.5.2", - "@nx/eslint": "21.1.2", - "@nx/eslint-plugin": "21.1.2", - "@nx/jest": "21.1.2", - "@nx/js": "21.1.2", - "@nx/react": "21.5.2", - "@nx/vite": "21.1.2", - "@nx/web": "21.1.2", - "@nx/workspace": "21.1.2", + "@nx/angular": "22.3.3", + "@nx/eslint": "22.3.3", + "@nx/eslint-plugin": "22.3.3", + "@nx/jest": "22.3.3", + "@nx/js": "22.3.3", + "@nx/react": "22.3.3", + "@nx/vite": "22.3.3", + "@nx/vitest": "22.3.3", + "@nx/web": "22.3.3", + "@nx/workspace": "22.3.3", "@schematics/angular": "20.1.5", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@swc-node/register": "1.9.2", @@ -57,17 +60,18 @@ "@testing-library/svelte": "^4.0.5", "@testing-library/user-event": "^14.5.2", "@types/jest": "29.5.14", - "@types/node": "^18.16.9", + "@types/node": "^20.0.0", "@types/react": "19.0.0", "@types/react-dom": "19.0.0", - "@typescript-eslint/eslint-plugin": "7.18.0", - "@typescript-eslint/parser": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@typescript-eslint/utils": "^7.18.0", "@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react-swc": "^3.5.0", - "@vitest/browser": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", - "@vitest/ui": "^3.2.4", + "@vitest/browser": "^4.0.13", + "@vitest/browser-playwright": "^4.0.13", + "@vitest/coverage-v8": "4.0.9", + "@vitest/ui": "4.0.9", "autoprefixer": "^10.4.16", "eslint": "8.57.1", "eslint-config-prettier": "10.1.5", @@ -75,7 +79,7 @@ "eslint-plugin-jsx-a11y": "6.10.1", "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "5.0.0", - "glob": "^10.3.10", + "glob": "^12.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-preset-angular": "^14.2.4", @@ -83,7 +87,7 @@ "jsdom": "^26.1.0", "jsonc-eslint-parser": "^2.1.0", "ng-packagr": "20.1.0", - "nx": "21.1.2", + "nx": "22.3.3", "playwright": "^1.50.1", "postcss": "^8.4.5", "postcss-import": "~14.1.0", @@ -93,23 +97,24 @@ "prettier": "^3.2.0", "prettier-plugin-svelte": "^3.1.2", "rollup": "^4.9.6", + "semantic-release": "^25.0.2", "svelte": "^4.2.19", "svelte-check": "^3.6.2", "swc-loader": "0.1.15", - "ts-jest": "^29.1.0", + "ts-jest": "29.4.6", "ts-node": "10.9.1", "typescript": "5.8.3", "vite": "~5.4.20", "vite-plugin-dts": "4.5.4", - "vitest": "^3.2.4", + "vitest": "4.0.9", "vitest-browser-react": "^1.0.0", "vitest-dom": "^0.1.1" }, "dependencies": { "@angular/animations": "20.1.6", - "@angular/common": "20.1.6", - "@angular/compiler": "20.1.6", - "@angular/core": "20.1.6", + "@angular/common": "20.3.14", + "@angular/compiler": "^20.3.16", + "@angular/core": "^20.3.16", "@angular/forms": "20.1.6", "@angular/platform-browser": "20.1.6", "@angular/platform-browser-dynamic": "20.1.6", @@ -119,11 +124,17 @@ "date-fns": "^3.0.6", "react": "19.0.0", "react-dom": "19.0.0", - "react-router-dom": "6.11.2", + "react-router-dom": "^6.30.3", "rxjs": "~7.8.0", + "style-dictionary": "^5.1.1", + "svelte-routing": "^2.13.0", "tslib": "^2.3.0", "zone.js": "0.15.1" }, + "overrides": { + "glob": "^12.0.0", + "esbuild": "^0.25.0" + }, "nx": { "includedScripts": [] } diff --git a/scripts/dev-setup b/scripts/dev-setup new file mode 100644 index 0000000000..d26292617f --- /dev/null +++ b/scripts/dev-setup @@ -0,0 +1,13 @@ +#!/usr/bin/bash + +if [ ! -f .env ]; then cp ./.env.example ./.env; fi + +if [ -d "./apps/dev" ]; then + echo "./apps/dev already exists. To re-create manually delete the current folder" + exit 0 +fi + +mkdir ./apps/dev +cp -r ./.templates/* ./apps/dev + +echo "Dev env created!" diff --git a/scripts/pg-setup b/scripts/pg-setup deleted file mode 100755 index c601f022d2..0000000000 --- a/scripts/pg-setup +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/bash - -if [ -d playground ]; then - echo "Playground folder already exists!" - exit 1 -fi - -mkdir ./playground -cp -r ./_templates/* ./playground diff --git a/scripts/pg-switch b/scripts/pg-switch deleted file mode 100755 index 7fde9b75d9..0000000000 --- a/scripts/pg-switch +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -if [ "$1" = "new" ]; then - target=$2 - option=$1 -else - target=$1 - option="" -fi - -# Ensure local repo is in sync with remote () -git fetch upstream - -if [ ! -n "$target" ]; then - echo "pg-switch [target] => Target repository is required" - exit 1 -fi - -if [ -n "$(git status -s -uno)" ]; then - echo "Uncommitted changes exist, commit or stash changes before proceeding" - exit 1 -fi - -# Create new branch if specified -if [ "$option" = "new" ]; then - git branch "$target" -elif [ -z "$(git branch | grep "$target")" ]; then - echo "[$target] is an invalid target branch name" - exit 1 -fi - -# Get the current git branch name -branch=$(git branch --show-current) - -# Check if branch equals target -if [ "$branch" = "$target" ]; then - echo "Already on target branch: $target" - exit 0 -fi - -# Check if .playgrounds directory exists, create it if it doesn't -if [ ! -d ".playgrounds/$branch" ]; then - mkdir -p .playgrounds/"$branch" -fi - -# Move the existing playground to the .playgrounds dir -if [ -d "playground" ]; then - mv playground/* .playgrounds/"$branch" -fi - -# Move the target playground to the `playground` dir to allow it to tested -targetdir=".playgrounds/$target" -if [ -n "$target" ] && [ -d "$targetdir" ]; then - cp -r "$targetdir"/* playground - rm -rf "$targetdir" -else - cp -r .templates/* playground -fi - -# Checkout the defined target repo -git checkout "$target" diff --git a/vitest.config.mjs b/vitest.config.mjs index 57aa73cd6e..ea1be387ab 100644 --- a/vitest.config.mjs +++ b/vitest.config.mjs @@ -1,5 +1,10 @@ import { defineConfig } from "vite"; +import { svelte, vitePreprocess } from "@sveltejs/vite-plugin-svelte"; +import react from "@vitejs/plugin-react"; +import { resolve } from "path"; +import { playwright } from "@vitest/browser-playwright"; + // https://vitejs.dev/config/ export default defineConfig({ @@ -7,8 +12,109 @@ export default defineConfig({ retries: 3, exclude: [ "**/node_modules", - "playground", + "apps", "libs/angular-components", // run angular via nx ], + projects: [ + { + plugins: [ + svelte({ + preprocess: vitePreprocess(), + include: ["**/*.svelte"], + compilerOptions: { + customElement: true, + }, + }), + ], + test: { + name: "web-component-unit", + globals: true, + environment: "jsdom", + alias: [{ find: /^svelte$/, replacement: "svelte/internal" }], + include: [ + "libs/web-components/src/**/*.{test,spec}.ts", + ], + setupFiles: ["vitest.web-component.setup.ts"], + }, + }, + { + plugins: [ + react(), + ], + test: { + name: "react-unit", + globals: true, + environment: "jsdom", + include: [ + "libs/react-components/src/**/*.{test,spec}.tsx", + ], + }, + }, + { + plugins: [ + react(), + ], + resolve: { + alias: { + '@abgov/ui-components-common': resolve(__dirname, './dist/libs/common/index.js'), + }, + }, + test: { + name: "react-browser", + globals: true, + environment: "jsdom", + include: [ + "libs/react-components/**/*.browser.{test,spec}.tsx", + ], + setupFiles: ["vitest.browser.setup.ts"], + browser: { + enabled: true, + provider: playwright(), + instances: [ + { browser: "chromium" }, + { browser: "firefox" }, + ] + }, + server: { + deps: { + inline: [/@abgov\/ui-components-common/] + } + } + }, + }, + { + plugins: [ + react(), + ], + resolve: { + alias: { + '@abgov/ui-components-common': resolve(__dirname, './dist/libs/common/index.js'), + }, + }, + test: { + name: "react-headless", + globals: true, + environment: "jsdom", + include: [ + "libs/react-components/**/*.browser.{test,spec}.tsx", + ], + setupFiles: ["vitest.browser.setup.ts"], + browser: { + enabled: true, + headless: true, + provider: playwright(), + instances: [ + { browser: "chromium" }, + { browser: "firefox" }, + ] + }, + server: { + deps: { + inline: [/@abgov\/ui-components-common/] + } + } + }, + }, + ] }, }); diff --git a/vitest.workspace.ts b/vitest.workspace.ts deleted file mode 100644 index ab1f453515..0000000000 --- a/vitest.workspace.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { defineWorkspace } from "vitest/config"; -import { svelte, vitePreprocess } from "@sveltejs/vite-plugin-svelte"; -import react from "@vitejs/plugin-react"; -import { resolve } from "path"; - -export default defineWorkspace([ - { - plugins: [ - svelte({ - preprocess: vitePreprocess(), - include: ["**/*.svelte"], - compilerOptions: { - customElement: true, - }, - }), - ], - test: { - name: "web-component-unit", - globals: true, - environment: "jsdom", - alias: [{ find: /^svelte$/, replacement: "svelte/internal" }], - include: [ - "libs/web-components/src/**/*.{test,spec}.ts", - ], - setupFiles: ["vitest.web-component.setup.ts"], - }, - }, - { - plugins: [ - react(), - ], - test: { - name: "react-unit", - globals: true, - environment: "jsdom", - include: [ - "libs/react-components/src/**/*.{test,spec}.tsx", - ], - }, - }, - { - plugins: [ - react(), - ], - resolve: { - alias: { - '@abgov/ui-components-common': resolve(__dirname, './dist/libs/common/index.js'), - }, - }, - test: { - name: "react-browser", - globals: true, - environment: "jsdom", - include: [ - "libs/react-components/**/*.browser.{test,spec}.tsx", - ], - setupFiles: ["vitest.browser.setup.ts"], - browser: { - provider: "playwright", - name: "chromium", - enabled: true, - }, - server: { - deps: { - inline: [/@abgov\/ui-components-common/] - } - } - }, - }, - { - plugins: [ - react(), - ], - resolve: { - alias: { - '@abgov/ui-components-common': resolve(__dirname, './dist/libs/common/index.js'), - }, - }, - test: { - name: "react-headless", - globals: true, - environment: "jsdom", - include: [ - "libs/react-components/**/*.browser.{test,spec}.tsx", - ], - setupFiles: ["vitest.browser.setup.ts"], - browser: { - provider: "playwright", - name: "chromium", - enabled: true, - headless: true, - }, - server: { - deps: { - inline: [/@abgov\/ui-components-common/] - } - } - }, - }, -]);