diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 8df41980..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "root": true, - "ignorePatterns": [ - "projects/**/*" - ], - "overrides": [ - { - "files": [ - "*.ts" - ], - "parserOptions": { - "project": [ - "./tsconfig.json" - ], - "createDefaultProgram": true - }, - "extends": [ - "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates" - ], - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "c", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "error", - { - "type": "element", - "prefix": "c", - "style": "kebab-case" - } - ], - "@angular-eslint/no-conflicting-lifecycle": "off" - } - }, - { - "files": [ - "*.html" - ], - "extends": [ - "plugin:@angular-eslint/template/recommended" - ], - "rules": {} - } - ] -} diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 354749a2..9af06c24 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -12,18 +12,20 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [22.x] os: [ubuntu-latest, windows-latest, macOS-latest] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - name: project check + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Project check run: | - npm i npm run build:icons:prod npm run build:lib:prod npm run lint:lib diff --git a/.github/workflows/project-chartjs-check.yml b/.github/workflows/project-chartjs-check.yml index ac202c07..331040ac 100644 --- a/.github/workflows/project-chartjs-check.yml +++ b/.github/workflows/project-chartjs-check.yml @@ -3,12 +3,12 @@ name: Project chartjs check on: push: branches: - - master - main + - v5.* pull_request: branches: - - master - main + - v5.* jobs: build: @@ -16,18 +16,20 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [22.x] os: [ubuntu-latest, windows-latest, macOS-latest] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - name: project check + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Project check run: | - npm i npm run build:chartjs:prod npm run lint:chartjs npm run test:chartjs:prod diff --git a/.github/workflows/project-icons-check.yml b/.github/workflows/project-icons-check.yml index 0cab6749..20b119c4 100644 --- a/.github/workflows/project-icons-check.yml +++ b/.github/workflows/project-icons-check.yml @@ -4,9 +4,11 @@ on: push: branches: - main + - v5.* pull_request: branches: - main + - v5.* jobs: build: @@ -14,18 +16,20 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [22.x] os: [ubuntu-latest, windows-latest, macOS-latest] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - name: project check + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Project check run: | - npm i npm run build:icons:prod npm run lint:icons npm run test:icons:prod diff --git a/.github/workflows/project-lib-check.yml b/.github/workflows/project-lib-check.yml index 68cd0c06..7fd5192f 100644 --- a/.github/workflows/project-lib-check.yml +++ b/.github/workflows/project-lib-check.yml @@ -3,16 +3,12 @@ name: Project lib check on: push: branches: - - master - main - - v4 - - v4.* + - v5.* pull_request: branches: - - master - main - - v4 - - v4.* + - v5.* jobs: build: @@ -20,18 +16,20 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [22.x] os: [ubuntu-latest, windows-latest, macOS-latest] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - name: project check + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Project check run: | - npm i npm run build:icons:prod npm run build:lib:prod npm run lint:lib diff --git a/.gitignore b/.gitignore index eabd950d..5e916bd9 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ speed-measure-plugin*.json /libpeerconnection.log testem.log /typings +.nx/ # System files .DS_Store diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000..3e85ffa2 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,7 @@ +module.exports = { + semi: true, + trailingComma: 'none', + singleQuote: true, + printWidth: 120, + tabWidth: 2 +}; diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..fcc5ed83 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,840 @@ +### [@coreui/angular](https://coreui.io/angular/) changelog + +--- + +#### `5.4.9` + +- chore(dependencies): update + +--- + +#### `5.4.8` + +- fix(form-check-input): checked prop overwrites checked from writeValue in ReactiveForms +- chore(dependencies): update + +--- + +#### `5.4.7` + +- fix(avatar): default size should be '' not `md` +- chore(dependencies): update + +--- + +#### `5.4.6` + +- chore(dependencies): update +- refactor(dropdown): migrate to contendChild(), constructor-based dependency injection to inject(), cleanup +- refactor(dropdown-item): add default role prop, cleanup +- refactor(dropdown-menu): migrate to contendChildren(), cleanup + +--- + +#### `5.4.5` + +- chore(dependencies): update +- refactor(coreui.types): add BooleanInput and NumberInput types + +--- + +#### `5.4.3` + +- chore(dependencies): update to `Angular 19.2` +- refactor(icon.component): cleanup, classList simplify +- refactor(chartjs.component): signal inputs, host bindings, cleanup +- fix(table-color): allow undefined type for color input prop +- fix(align): allow undefined type for align input prop + +--- + +#### `5.4.1` + +- chore(dependencies): update + +--- + +#### `5.4.0` + +- chore(dependencies): version bump and tilde `~` dependencies for @coreui/* packages with Sass modules + +--- + +#### `5.3.16` + +- chore(dependencies): tilde `~` dependencies for @coreui/* packages to avoid Sass modules mismatch + +--- + +#### `5.3.15` + +- refactor: linkedSignal source cleanup +- refactor(form): host binding, cleanup, tests +- refactor(form-floating): host binding, cleanup, tests +- test(form-select): coverage +- test(form-check-input): indeterminate coverage +- refactor(modal-toggle): host binding, cleanup, tests +- refactor(navbar-toggler): host binding, cleanup, tests +- refactor(template-id): signal inputs, cleanup, tests +- test(bg-color): css classes coverage +- test(border): css classes coverage +- fix(border): border input boolean +- test(rounded): css classes coverage +- fix(rounded): border input boolean +- refactor(text-bg-color): host binding, cleanup, tests +- refactor(text-color): host binding, cleanup, tests +- test(shadow-on-scroll): coverage +- test(visible): coverage +- refactor(utilities): module minor cleanups +- refactor(sidebar-toggler): signal inputs, host bindings, cleanup +- refactor(sidebar-toggle): signal inputs, host bindings, cleanup +- refactor(sidebar-nav-link): signal output +- refactor(sidebar-brand): signal inputs, host bindings, cleanup +- refactor(sidebar): signal inputs, host bindings, cleanup, use inert attribute +- chore(dependencies): update + +--- + +#### `5.3.14` + +- fix(carousel): when paused (interval=0) and manually changed slide, it does not restart when interval>0 +- refactor(carousel-item): add attribute role = "group" +- refactor(carousel-inner): add aria-live "off" for interval > 0, otherwise "polite" +- fix(carousel-control): allow custom content (regression) +- refactor(carousel): add interval to carousel state +- fix(carousel.config): set default interval to 0 +- fix(theme.directive): use colorScheme if dark not set +- refactor(progress-bar): set default value=0 +- refactor(dropdown): signal inputs, host bindings, cleanup, tests +- refactor(dropdown-item): set default value of disabled prop to false +- refactor(dropdown-close): set default value of disabled prop to false +- chore(dependencies): update + +--- + +#### `5.3.12` + +- fix(carousel): first image slides in for `crossfade` transition, animations refactor, closes #213 - thanks @baloo32 +- fix(carousel): `interval` prop value change should set/reset timer, closes #214 - thanks @baloo32 +- chore(dependencies): update + +--- + +#### `5.3.10` + +- fix(offcanvas): offcanvas hides on animation.done toState visible, refactor +- refactor(backdrop): minor cleanups + +--- + +#### `5.3.9` + +- chore(dependencies): update +- fix(accordion): accordion item not expanded when visible=true on init (regression) +- refactor(alert): signal inputs, host bindings, cleanup, tests +- refactor(breadcrumb): signal inputs, host bindings, cleanup, tests +- refactor(grid): signal inputs, host bindings, cleanup, tests +- refactor(header): signal inputs, host bindings, cleanup, tests +- refactor(theme.directive): signal inputs, host bindings, cleanup, tests +- refactor(offcanvas): signal inputs, host bindings, cleanup, tests +- refactor(pagination): signal inputs, host bindings, cleanup, tests +- refactor(carousel): signal inputs, host bindings, cleanup, tests +- feat(carousel-indicators): allow custom content via TemplateId directive, refactor +- test(accordion): coverage +- test(backdrop): coverage +- test(card-img): coverage +- test(collapse): coverage +- test(element-ref): update +- test(placeholder): coverage +- test(popover): coverage +- test(tooltip): coverage + +--- + +#### `5.3.8` + +- chore(dependencies): update to `Angular 19.1` +- refactor(form-control): signal inputs, host bindings, cleanup +- refactor(form-select): signal inputs, host bindings, cleanup +- refactor(form-label): signal inputs, host bindings, cleanup +- refactor(form-feedback): signal inputs, host bindings, cleanup +- refactor(form-check): signal inputs, host bindings, cleanup +- refactor(form): signal inputs, host bindings, cleanup +- refactor(input-group): cleanup +- refactor(nav): signal inputs, host bindings, cleanup, tests +- refactor(modal): signal inputs, host bindings, cleanup, +- refactor(progress): signal inputs, host bindings, cleanup, tests, service introduction +- refactor(table-active): signal inputs, host bindings, cleanup, tests +- refactor(table-color): signal inputs, host bindings, cleanup, tests +- refactor(table): signal inputs, host bindings, cleanup, tests +- refactor(tab): signal inputs, host bindings, cleanup, tests +- refactor(toast): signal inputs, host bindings, cleanup +- refactor(align): signal inputs, host bindings, cleanup, tests +- refactor(bg-color): signal inputs, host bindings, cleanup, tests +- refactor(border): signal inputs, host bindings, cleanup, tests +- refactor(rounded): signal inputs, host bindings, cleanup, tests +- refactor(shadow-on-scroll): signal inputs, host bindings, cleanup +- refactor(visible): signal inputs, cleanup +- refactor: make EffectRef #private + +--- + +#### `5.3.7` + +- fix(collapse): collapse not expanded when initial visible=true +- fix(offcanvas): use `inert` attribute instead of `aria-hidden` +- chore(dependencies): update + +--- + +#### `5.3.5` + +- chore(dependencies): update +- feat(services): uid service +- feat(services): rtl service +- refactor(form-floating): signal inputs, host bindings, cleanup +- test(progress): cleanup + +--- + +#### `5.3.4` + +- chore(dependencies): update +- refactor: migrate constructor-based dependency injection to inject function +- fix(tab-panel): avoid initial transition + +--- + +#### `5.3.3` + +- chore(dependencies): update +- fix(accordion): accordion item not expanded on init when visible=true +- refactor(avatar): remove NgOptimizedImage directive, add object-fit: cover +- chore(workflows): update node-version to 22.x + +--- + +#### `5.3.2` +- chore(dependencies): update +- chore(workflows): update with npm ci +- fix(package-lock): rebuild + +--- + +#### `5.3.1` + +- chore(dependencies): update +- fix(tabs): NG0950 required input is accessed before a value is set tempfix + +--- + +#### `5.3.0` + +- chore(dependencies): update to `Angular 19` +- refactor: directives, components and pipes are now standalone by default +- refactor: remove deprecated 'allowSignalWrites' flag for effect() - writes are allowed by default + +--- + +#### `5.2.25` + +- chore(dependencies): update to Angular `18.2.12` +- fix(tabs-list): allowSignalWrites for tabsService effect + +--- + +#### `5.2.24` + +- chore(dependencies): update to Angular `18.2.11` +- refactor(tab-panel): animateChild for optional nested animations + +--- + +#### `5.2.23` + +- chore(dependencies): update +- refactor(html-attr.directive): signal input, cleanup +- refactor(icon): signal inputs, host bindings, cleanup + +--- + +#### `5.2.22` + +- chore(dependencies): update +- refactor(collapse): input signals, host bindings +- refactor(navbar): input signals, host bindings +- refactor(icon.directive): host binding innerHtml +- refactor(offcanvas): minor fixes +- refactor(sidebar-nav): minor fixes + +--- + +#### `5.2.21` + +- chore(dependencies): update + +--- + +#### `5.2.20` + +- chore(dependencies): update to Angular `18.2.8` +- refactor(accordion): input signals, host bindings +- refactor(toaster.service): readonly props + +--- + +#### `5.2.19` + +- chore(dependencies): update to Angular `18.2.6` +- refactor(spinner): input signals, host bindings, ng-content default fallback content + +--- + +#### `5.2.18` + +- chore(dependencies): update to Angular `18.2.5` +- fix(progress-bar): bar animation fails for no style width on 0 percent +- refactor(popover): use ComponentRef setInput() api, input signals, host bindings +- refactor(tooltip): use ComponentRef setInput() api, input signals, host bindings +- refactor(toast): use ComponentRef setInput() api, input signals +- fix(widget-stat-f): rounded-start-1 bg for icon without padding, text-color for value prop +- refactor(callout): input signals, host bindings +- refactor(card-header-actions): host bindings +- refactor(card-img): input signals, host bindings +- refactor(card): host bindings +- refactor(input-group): input signals, host bindings +- refactor(container): input signals, host bindings +- refactor(header): input signals, host bindings +- refactor(widgets): input signals, host bindings +- refactor(collapse): input signals, host bindings + +--- + +#### `5.2.17` + +- refactor(img): input signals, host bindings +- refactor(list-group): input signals, host bindings +- chore(dependencies): update to Angular `18.2.2` + - see also: vulnerability [Webpack AutoPublicPathRuntimeModule has a DOM Clobbering Gadget that leads to XSS](https://github.com/advisories/GHSA-4vvj-4cpr-p986) + +--- + +#### `5.2.16` + +- refactor(footer): input signals, host bindings +- refactor(placeholder): input signals, host bindings +- chore(dependencies): update `eslint` to `^9.9.1` +- chore(dependencies): update `typescript-eslint` to `~8.3.0` +- chore(dependencies): update `tslib` to `^2.7.0` +- chore(dependencies): update `micromatch` to `4.0.8` + - see also: vulnerability [Regular Expression Denial of Service (ReDoS) in micromatch](https://github.com/advisories/GHSA-952p-6rrq-rcjv) + +--- + +#### `5.2.15` + +- refactor(button): input signals, host bindings +- refactor(button-close): input signals, host bindings +- refactor(avatar): host bindings +- refactor(badge): host bindings +- chore(dependencies): update to Angular `18.2.1` +- chore(dependencies): update to typescript-eslint `~8.2.0` + +--- + +#### `5.2.14` + +- chore(dependencies): update to Angular `18.2` +- chore(dependencies): update to typescript `~5.5.4` +- chore(dependencies): update to typescript-eslint `~8.1.0` +- chore(dependencies): update to angular-eslint `~18.3.0` +- refactor(button): input signals + +--- + +#### `5.2.13` + +- chore(dependencies): update +- chore(karma.conf): add custom chrome launcher with `--disable-search-engine-choice-screen` flag +- refactor: remove empty constructors, wrapper components host class cleanups + +--- + +#### `5.2.12` + +- chore(dependencies): update +- chore(eslint): update `eslint` to v9, `angular-eslint`, `typescript-eslint` +- refactor: eslint minor syntax cleanups + +--- + +#### `5.2.11` + +- feat(schematics): ng-add basic integration +- chore(dependencies): update + +--- + +#### `5.2.7` + +- chore(dependencies): update + +--- + +#### `5.2.5` + +- chore(dependencies): update to Angular 18.1 +- refactor: update calls to `afterRender` with an explicit phase to the new API + +--- + +#### `5.2.3` + +- chore(dependencies): update +- refactor(accordion): minor cleanup, add host class metadata +- refactor(avatar): template default ng-content, host class metadata, input signals +- refactor(badge): host class metadata, input signals +- refactor(card): host class metadata, input signals +- refactor(text-bg-color): input signals +- refactor(text-color): input signals +- refactor(widget-stat-b): input signals +- refactor(modal): minor syntax cleanup + +--- + +#### `5.2.2` + +- chore(dependencies): update +- fix(tabs2): missing exportAs +- fix(tab.directive): missing disabled attribute + +--- + +#### `5.2.1` + +- chore(dependencies): update + +--- + +#### `5.2.0` + +- chore(dependencies): update to `Angular 18` +- feat(tabs): Angular tabs reimagined structure, keyboard interactions and WAI-ARIA support + +--- + +#### `5.1.2` + +- chore(dependencies): update (js-yaml vulnerability) +- fix(avatar): add `alt` prop for img alternate text +- fix(footer): set default `role="contentinfo"` +- fix(header): set default `role="banner"` +- fix(sidebar-nav): set default `role="navigation"` +- fix(tab-pane): add default `role="tabpanel"` +- fix(TabContentRef): add `aria-selected` attribute and default `role="tab"` + +--- + +#### `5.1.1` + +- chore(dependencies): update +- fix(dropdown): add aria-expanded attribute, refactor + +--- + +#### `5.1.0` + +- chore(dependencies): update +- feat: element-ref directive +- feat(tooltip): reference input for positioning the tooltip on reference element, refactor with signals +- refactor(listeners.service): add focusin Trigger +- refactor(template-id.directive): cleanup, add missing test + +--- + +#### `5.0.4` + +- chore(dependencies): update +- fix(tooltip): do not show the tooltip for empty content, refactor with input() + +--- + +#### `5.0.3` + +- chore(dependencies): update +- test: add missing tests, refactor + +--- + +#### `5.0.2` + +- chore(dependencies): update +- fix(icon): cIcon directive [name] binding does not refresh icon in angular 17 #203 +- refactor(icons-angular): use Angular signals +- test(icons-angular): update + +--- + +#### `5.0.1` + +- chore(dependencies): update +- fix(color-mode.service): afterNextRender() for SSR +- fix(local-storage.service): provide null for empty Storage.getItem() value + +--- + +#### `5.0.0` + +- chore(dependencies): update to `Angular 17.3` +- chore(dependencies): update to `CoreUI 5` +- refactor(sidebar): drop sidebar-toggler component, use directive instead, use control flow, use Input() transform +- refactor(widget): update to v5 +- fix(tooltip): update offset for v5 +- refactor(toast): use Input() transform +- feat(utilities): shadow-on-scroll directive +- refactor(tabs): use Input() transform +- refactor(table.type): Partial attributes +- feat: ThemeDirective +- feat(services): v5 color-mode, local-storage, in-memory-storage, script-injector +- refactor(progress): add progress-stacked component, update testing, rewrite with signals +- refactor(progress): add progress-bar props for simplified use with [value] +- fix(popover): update offset for v5 +- refactor(placeholder): use Input() transform +- refactor(offcanvas): use ThemeDirective composition for dark prop +- refactor(navbar): colorScheme prop replaced with ThemeDirective composition +- fix(row): row-cols-n for xs="n" +- refactor(form-check-input): use Input() transform +- refactor(dropdown): allow to select a dropdown-item with up/down arrows, testing update, use Input() transform +- refactor(dropdown): implement FocusableOption interface for items +- refactor(dropdown): use ThemeDirective composition for dark prop +- refactor(collapse): use Input() transform +- refactor(carousel): control flow, use Input() transform, ThemeDirective composition for dark prop +- refactor(card): use TextColorDirective composition +- refactor(button-close): deprecate white input prop, use ThemeDirective composition for dark prop +- refactor(breadcrumb): cleanups, add routeSnapshot.title as fallback value, use control flow, use Input() transform +- refactor(badge): update TextColors, use TextColorDirective composition +- chore(backdrop.service): cleanup +- refactor(avatar): update TextColors, use TextColorDirective composition, use control flow +- refactor(alert): use Input() transform, use control flow +- refactor(coreui.types): update to v5 +- refactor(accordion): use Input() transform +- refactor(chartjs): update to ChartJS 4.x, types cleanup, use afterRender for SSR +- refactor(icon): add afterNextRender for SSR, add aria-hidden attribute, improve testing +- feat(utilities): TextBgColor directive +- refactor(badge): improve background and text color handling with TextBgColor directive composition api +- refactor(card): improve background and text color handling with TextBgColor directive composition api + +--- + +#### `4.7.18` + +- chore(dependencies): update + +--- + +#### `4.7.17` + +- chore(dependencies): update to `Angular 17.3` + +--- + +#### `4.7.16` + +- chore(dependencies): update + +--- + +#### `4.7.15` + +- fix(sidebar-nav-group): typo on control flow migration - thanks @meriturva, closes #200 +- chore(workflows): update github actions to v4 - checkout, setup-node + +--- + +#### `4.7.14` + +- chore(dependencies): update to `Angular 17.2` + +--- + +#### `4.7.13` + +- refactor(@coreui/angular): use control flow +- fix(chartjs): canvas already in use, refactor + +--- + +#### `4.7.12` + +- chore(dependencies): update +- fix(chartjs): use afterRender, afterNextRender fails - temp fix + +--- + +#### `4.7.10` + +- fix(toast): types +- fix(carousel): types +- fix(sidebar): missing export SidebarNavHelper +- chore(dependencies): update + +--- + +#### `4.7.8` + +- refactor: allow getComputedStyle() to be undefined for SSR +- refactor(tooltip): for use with IntersectionService providedIn root +- refactor(popover): for use with IntersectionService providedIn root +- refactor(carousel): for use with IntersectionService providedIn root +- refactor(IntersectionService): providedIn root, allow multiple observers, add unobserve() method +- refactor(icon): afterNextRender in case of SSR +- refactor(chartjs): afterNextRender in case of SSR + +--- + +#### `4.7.7` + +- chore(dependencies): update + +--- + +#### `4.7.6` + +- chore(dependencies): update + +--- + +#### `4.7.3` + +- refactor(backdrop, modal, offcanvas): move scrollbar adjustments to offcanvas, cleanups + feat(modal): restore focus on modal hide, set focus to visible modal +- fix(backdrop): add missing export +- chore(dependencies): update + +--- + +#### `4.7.0` + +- chore(dependencies): update to `Angular 17` + - `Angular 17` + - `TypeScript ~5.2` + - `zone.js ~0.14.2` +- chore: update tsconfig and eslintrc +- refactor: minor cleanups - typings, tests +- chore: update `.github/workfows` for node-version 20 + +--- + +#### `4.5.28` + +- chore(dependencies): update + +--- + +#### `4.5.27` + +- chore(dependencies): update + +see: [Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code](https://github.com/coreui/coreui-angular/security/dependabot/31) + +--- + +#### `4.5.25` + +- chore: sync with v4.5.25 +- chore(dependencies): update + +--- + +#### `4.5.16` + +- chore(dependencies): update + +--- + +#### `4.5.15` + +- chore(dependencies): update to Angular 16.2 +- fix(icon): check name value for undefined + +--- + +#### `4.5.14` + +- fix(@coreui/angular): add missing peerDependencies +- refactor(sidebar-nav): IconDirective imports + +--- + +#### `4.5.13` + +- chore(dependencies): update + +--- + +#### `4.5.11` + +- chore(dependencies): update + +--- + +#### `4.5.10` + +- refactor: @Input() transform option of @angular/core@16.1 instead of @angular/cdk coerce functions (partial) +- chore: dependencies update (angular v16.1.4) +- chore: peerDependencies update to Angular 16.1 + +--- + +#### `4.5.8` + +- fix(toast): show animation not working +- refactor(toast): remove: onAnimationEvent(), @fadeInOut.start, @fadeInOut.done +- fix(toaster): drop setTimeout() on removeToast() +- refactor(toaster): move to takeUntilDestroyed() +- chore: dependencies update (angular v16.1.3) + +--- + +#### `4.5.2` + +- fix(tooltip): add IntersectionObserver to remove tooltip when host element is not visible +- chore: dependencies update + +--- + +#### `4.5.0` + +- chore: dependencies update + - `Angular 16` + - `TypeScript ~4.9.3` +- refactor(breadcrumb-router.service): router.events takeUntilDestroyed() +- refactor(toaster): remove ComponentFactoryResolver + +--- + +#### `4.4.9` + +- refactor: safe ?.unsubscribe() from subscriptions +- chore(dependencies): update + +--- + +#### `4.4.8` + +- refactor(tabs): safe tabServiceSubscription?.unsubscribe() +- chore(dependencies): update + +--- + +#### `4.4.7` + +- feat(form-check): add reverse prop +- chore(dependencies): update + +--- + +#### `4.4.1` + +- fix(alert): typo in template +- refactor(html-attr): cleanup +- refactor(icon, icon-set): cleanup + +--- + +#### `4.4.0` + +- chore: dependencies update +- chore(sidebar): minor cleanups + +--- + +#### `4.4.0-next.1` + +- feat: standalone components +- chore: dependencies update +- fix(popover): remove popover when host element is not visible + +--- + +#### `4.3.17` + +- `@coreui/angular` +- `@coreui/angular-chartjs` +- `@coreui/icons-angular` + - chore: dependencies update + +--- + +#### `4.3.16` + +- `@coreui/angular` + - chore: dependencies update +- `@coreui/angular-chartjs` + - chore: dependencies update +- `@coreui/icons-angular` + - feat(cIcon): standalone directive + - chore: dependencies update + +--- + +#### `4.3.15` + +- `@coreui/angular-chartjs` + - feat(c-chart): emit chartRef on new Chart() + - feat(c-chart): standalone component + - chore: dependencies update + +--- + +#### `4.3.11` + +- fix(offcanvas): avoid flicker on the first render + +--- + +#### `4.4.0-next.0` + +- feat: standalone components (wip) + +--- + +#### `4.3.10` + +- feat(offcanvas): add responsive variations +- refactor(offcanvas): animation classes, scrollbar behavior, cleanup +- refactor(modal, offcanvas): move get scrollbarWidth to BackdropService +- feat(offcanvas): add backdrop static option support +- chore: dependencies update + +--- + +#### `4.3.9` + +- chore: dependencies update + +--- + +#### `4.3.8` + +- fix(dropdown): visibleChange emit and visibleState update on changes, refactor with rxjs + +--- + +#### `4.3.7` + +update to: + +- `Angular 15.1` + +--- + +#### `4.3.0` + +update to: + +- `Angular 15` +- `TypeScript 4.8` +- `RxJS 7.5` + +--- diff --git a/CLI.md b/CLI.md index 91e6e03f..cd0a31a1 100644 --- a/CLI.md +++ b/CLI.md @@ -1,10 +1,10 @@ -# @coreui/angular v4 +# @coreui/angular v5 -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.0.4. +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 19.1.0. ## Development server -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. ## Code scaffolding @@ -24,4 +24,4 @@ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To u ## Further help -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/LICENSE b/LICENSE index 1f38323c..fbb053e0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 creativeLabs Łukasz Holeczek +Copyright (c) 2025 creativeLabs Łukasz Holeczek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index fc3a6487..255fba10 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- + CoreUI logo

-

CoreUI for Angular

+

CoreUI Components for Angular

- Angular Components Library built on top of Bootstrap 5 and TypeScript. + Angular Components Library built on top of Bootstrap 5.3 and TypeScript 5.x
-
Explore CoreUI for Angular docs » + Explore CoreUI for Angular docs and examples »
-
- Report a bug + CoreUI Docs + · + Report a bug · - Request a feature + Request a feature · - Blog + Blog +

+
+

+Featured CoreUI for Angular libraries: +
CoreUI Components for Angular +
CoreUI Angular wrapper for Chart.js v4 +
CoreUI Icons for Angular

+
+ -## Status +### Status ![angular][angular-badge] +[![npm-coreui-angular-v5-ng19][npm-coreui-angular-badge-v5-ng19]][npm-coreui-angular] [![npm-coreui-angular-latest][npm-coreui-angular-badge-latest]][npm-coreui-angular] [![npm-coreui-angular-next][npm-coreui-angular-badge-next]][npm-coreui-angular] -[![NPM downloads][npm-coreui-angular-download]][npm-coreui-angular] +[![NPM downloads][npm-coreui-angular-download]][npm-coreui-angular] [![Build](https://github.com/coreui/coreui-angular/actions/workflows/build-check.yml/badge.svg)](https://github.com/coreui/coreui-angular/actions/workflows/build-check.yml) -[npm-coreui-angular-badge-latest]: https://img.shields.io/npm/v/@coreui/angular/latest?style=flat-square&color=brightgreen -[npm-coreui-angular-badge-next]: https://img.shields.io/npm/v/@coreui/angular/next?style=flat-square&color=red -[npm-coreui-angular]: https://www.npmjs.com/package/@coreui/angular -[npm-coreui-angular-download]: https://img.shields.io/npm/dm/@coreui/angular.svg?style=flat-square -[angular-badge]: https://img.shields.io/badge/angular-^14.2.0-lightgrey.svg?style=flat-square&logo=angular ## Table of contents - [Status](#status) +- [Table of contents](#table-of-contents) - [Quick start](#quick-start) + - [Prerequisites](#prerequisites) + - [Node.js](#nodejs) + - [Angular CLI](#angular-cli) + - [Installation](#installation) + - [CoreUI CSS files](#coreui-css-files) + - [Installation](#installation-1) + - [Basic usage](#basic-usage) + - [Bootstrap CSS files](#bootstrap-css-files) + - [Installation (optional)](#installation-optional) - [Templates](#templates) - [Bugs and feature requests](#bugs-and-feature-requests) - [Documentation](#documentation) @@ -59,7 +78,7 @@ Before you begin, make sure your development environment includes `Node.js®` and `npm` package manager. ###### Node.js -[**Angular 14**](https://angular.io/guide/what-is-angular) requires `Node.js` LTS version `^14.15` or `^16.10`. +[**Angular 19**](https://angular.dev/overview) requires `Node.js` LTS version `^18.19`, `^20.11` or `^22.0`. - To check your version, run `node -v` in a terminal/console window. - To get `Node.js`, go to [nodejs.org](https://nodejs.org/). @@ -71,13 +90,14 @@ Install the Angular CLI globally using a terminal/console window. npm install -g @angular/cli ``` -### Instalation +### Installation Several quick start options are available (pick one): - -- [Download the latest release](https://github.com/coreui/coreui-angular/) -- Clone the repo: `git clone https://github.com/coreui/coreui-angular.git` -- Install with [npm](https://www.npmjs.com/): `npm install @coreui/angular` -- Install with [yarn](https://yarnpkg.com/): `yarn add @coreui/angular` +- Add CoreUI to your Angular project: + - Install with [Angular CLI](https://angular.dev/cli/add): `ng add @coreui/angular` + - Install with [npm](https://www.npmjs.com/): `npm install @coreui/angular @coreui/icons-angular @coreui/coreui` +- Get the source code: + - [Download the latest release](https://github.com/coreui/coreui-angular/) + - Clone the repo: `git clone https://github.com/coreui/coreui-angular.git` Read the [Getting started page](https://coreui.io/angular/docs/) for information on the framework contents, templates and examples, and more. @@ -92,7 +112,7 @@ npm install @coreui/coreui --save ##### Basic usage ```scss -import '~@coreui/coreui/dist/css/coreui.min.css' +@import "@coreui/coreui/scss/coreui"; ``` #### Bootstrap CSS files @@ -118,7 +138,7 @@ The documentation for the CoreUI & CoreUI PRO is hosted at our website [CoreUI f ## Frameworks -CoreUI supports most popular frameworks. +CoreUI supports the most popular frameworks. - [CoreUI for Bootstap(Vanilla JS)](https://github.com/coreui/coreui) - [CoreUI for React](https://github.com/coreui/coreui-react) @@ -209,4 +229,11 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2022 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2025 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). + +[npm-coreui-angular-badge-v5-ng19]: https://img.shields.io/npm/v/@coreui/angular/v5-ng19?style=flat-square&color=brightgreen +[npm-coreui-angular-badge-latest]: https://img.shields.io/npm/v/@coreui/angular/latest?style=flat-square&color=brightgreen +[npm-coreui-angular-badge-next]: https://img.shields.io/npm/v/@coreui/angular/next?style=flat-square&color=red +[npm-coreui-angular]: https://www.npmjs.com/package/@coreui/angular +[npm-coreui-angular-download]: https://img.shields.io/npm/dm/@coreui/angular.svg?style=flat-square +[angular-badge]: https://img.shields.io/badge/angular-^19.2.0-lightgrey.svg?style=flat-square&logo=angular diff --git a/angular.json b/angular.json index 3d4c0d8f..8aa4e134 100644 --- a/angular.json +++ b/angular.json @@ -40,6 +40,10 @@ "options": { "main": "projects/coreui-angular/src/test.ts", "tsConfig": "projects/coreui-angular/tsconfig.spec.json", + "polyfills": [ + "zone.js", + "zone.js/testing" + ], "karmaConfig": "projects/coreui-angular/karma.conf.js" } }, @@ -49,7 +53,8 @@ "lintFilePatterns": [ "projects/coreui-angular/**/*.ts", "projects/coreui-angular/**/*.html" - ] + ], + "eslintConfig": "projects/coreui-angular/eslint.config.js" } } } @@ -85,6 +90,10 @@ "options": { "main": "projects/coreui-angular-chartjs/src/test.ts", "tsConfig": "projects/coreui-angular-chartjs/tsconfig.spec.json", + "polyfills": [ + "zone.js", + "zone.js/testing" + ], "karmaConfig": "projects/coreui-angular-chartjs/karma.conf.js" } }, @@ -94,7 +103,8 @@ "lintFilePatterns": [ "projects/coreui-angular-chartjs/**/*.ts", "projects/coreui-angular-chartjs/**/*.html" - ] + ], + "eslintConfig": "projects/coreui-angular-chartjs/eslint.config.js" } } } @@ -130,6 +140,10 @@ "options": { "main": "projects/coreui-icons-angular/src/test.ts", "tsConfig": "projects/coreui-icons-angular/tsconfig.spec.json", + "polyfills": [ + "zone.js", + "zone.js/testing" + ], "karmaConfig": "projects/coreui-icons-angular/karma.conf.js" } }, @@ -139,10 +153,29 @@ "lintFilePatterns": [ "projects/coreui-icons-angular/**/*.ts", "projects/coreui-icons-angular/**/*.html" - ] + ], + "eslintConfig": "projects/coreui-icons-angular/eslint.config.js" } } } } + }, + "schematics": { + "@angular-eslint/schematics:application": { + "setParserOptionsProject": true + }, + "@angular-eslint/schematics:library": { + "setParserOptionsProject": true + }, + "@schematics/angular:component": { + "standalone": true, + "style": "scss" + }, + "@schematics/angular:directive": { + "standalone": true + }, + "@schematics/angular:pipe": { + "standalone": true + } } } diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..1919ce9a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,53 @@ +// @ts-check +const eslint = require('@eslint/js'); +const tseslint = require('typescript-eslint'); +const angular = require('angular-eslint'); + +module.exports = tseslint.config( + { + files: ['**/*.ts'], + extends: [ + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.stylistic, + ...angular.configs.tsRecommended + ], + processor: angular.processInlineTemplates, + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'c', + style: 'camelCase' + } + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'c', + style: 'kebab-case' + } + ], + '@angular-eslint/no-input-rename': 'warn', + '@angular-eslint/no-output-rename': 'warn', + '@typescript-eslint/consistent-indexed-object-style': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + 'no-unused-private-class-members': 'warn' + } + }, + { + files: ['**/*.html'], + extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility], + rules: { + '@angular-eslint/template/elements-content': 'off', + '@angular-eslint/template/alt-text': 'off', + '@angular-eslint/template/interactive-supports-focus': 'warn', + '@angular-eslint/template/click-events-have-key-events': 'warn', + '@angular-eslint/template/label-has-associated-control': 'warn' + } + } +); diff --git a/package-lock.json b/package-lock.json index 6f04a1e9..6b628331 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,209 +1,212 @@ { "name": "coreui-angular-dev", - "version": "4.2.18", - "lockfileVersion": 2, + "version": "5.4.9", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coreui-angular-dev", - "version": "4.2.18", - "license": "MIT", - "dependencies": { - "@angular/animations": "^14.2.12", - "@angular/cdk": "^14.2.7", - "@angular/common": "^14.2.12", - "@angular/compiler": "^14.2.12", - "@angular/core": "^14.2.12", - "@angular/forms": "^14.2.12", - "@angular/localize": "^14.2.12", - "@angular/platform-browser": "^14.2.12", - "@angular/platform-browser-dynamic": "^14.2.12", - "@angular/router": "^14.2.12", - "@coreui/chartjs": "^3.0.0", - "@popperjs/core": "~2.11.6", - "chart.js": "^3.9.1", + "version": "5.4.9", + "license": "MIT", + "dependencies": { + "@angular/animations": "^19.2.7", + "@angular/cdk": "^19.2.10", + "@angular/common": "^19.2.7", + "@angular/compiler": "^19.2.7", + "@angular/core": "^19.2.7", + "@angular/forms": "^19.2.7", + "@angular/localize": "^19.2.7", + "@angular/platform-browser": "^19.2.7", + "@angular/platform-browser-dynamic": "^19.2.7", + "@angular/router": "^19.2.7", + "@coreui/chartjs": "~4.1.0", + "@coreui/icons": "^3.0.1", + "@popperjs/core": "~2.11.8", + "chart.js": "^4.4.9", "lodash-es": "^4.17.21", - "rxjs": "~7.5.0", - "tslib": "^2.4.1", - "zone.js": "~0.11.8" + "rxjs": "~7.8.2", + "tslib": "^2.8.1", + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^14.2.10", - "@angular-eslint/builder": "^14.4.0", - "@angular-eslint/eslint-plugin": "^14.4.0", - "@angular-eslint/eslint-plugin-template": "^14.4.0", - "@angular-eslint/schematics": "^14.4.0", - "@angular-eslint/template-parser": "^14.4.0", - "@angular/cli": "^14.2.10", - "@angular/compiler-cli": "^14.2.12", - "@angular/language-service": "^14.2.12", - "@coreui/icons": "^2.1.0", - "@types/jasmine": "~4.3.0", - "@types/lodash-es": "^4.17.6", - "@types/node": "^16.18.4", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", - "eslint": "~8.29.0", - "jasmine-core": "^4.5.0", - "karma": "^6.4.1", - "karma-chrome-launcher": "^3.1.1", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "^2.0.0", - "ng-packagr": "^14.2.2", - "prettier": "^2.7.1", - "typescript": "~4.7.4" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": ">=6" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", - "dev": true + "@angular-devkit/build-angular": "^19.2.8", + "@angular-devkit/schematics": "^19.2.8", + "@angular/cli": "^19.2.8", + "@angular/compiler-cli": "^19.2.7", + "@angular/language-service": "^19.2.7", + "@types/jasmine": "^5.1.7", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.14.1", + "angular-eslint": "^19.3.0", + "copyfiles": "^2.4.1", + "eslint": "^9.24.0", + "jasmine-core": "^5.6.0", + "karma": "^6.4.4", + "karma-chrome-launcher": "^3.2.0", + "karma-coverage": "^2.2.1", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.1.0", + "ng-packagr": "^19.2.2", + "prettier": "^3.5.3", + "typescript": "~5.7.3", + "typescript-eslint": "^8.30.1" + }, + "engines": { + "node": "^20.11.1 || ^22.0.0", + "npm": ">=9" + } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", + "version": "0.1902.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.8.tgz", + "integrity": "sha512-0A1EhtC/A/N7ukOD+s04l7sCyeSF5llBupkZdksSfi5y56s8U6Lt7KuqrbsErkOKgaCWrP/+Ef8fo0RmYpnefQ==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" + "@angular-devkit/core": "19.2.8", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/architect/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/architect/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/build-angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.10.tgz", - "integrity": "sha512-VCeZAyq4uPCJukKInaSiD4i/GgxgcU4jFlLFQtoYNmaBS4xbPOymL19forRIihiV0dwNEa2L694vRTAPMBxIfw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/build-webpack": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.10", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.8.tgz", + "integrity": "sha512-jlOig9cXfjvH34mq74wAznXpRTb88XP1g5ZE8rKch4qGwh+mFF7aES86MxCvMZGXgz6KckC5dIEL7VHuB7NVCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1902.8", + "@angular-devkit/build-webpack": "0.1902.8", + "@angular-devkit/core": "19.2.8", + "@angular/build": "19.2.8", + "@babel/core": "7.26.10", + "@babel/generator": "7.26.10", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.26.8", + "@babel/plugin-transform-async-to-generator": "7.25.9", + "@babel/plugin-transform-runtime": "7.26.10", + "@babel/preset-env": "7.26.9", + "@babel/runtime": "7.26.10", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "19.2.8", + "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", - "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", + "autoprefixer": "10.4.20", + "babel-loader": "9.2.1", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "12.0.2", + "css-loader": "7.1.2", + "esbuild-wasm": "0.25.1", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.3", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.0.0", + "less": "4.2.2", + "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.2", + "open": "10.1.0", "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "postcss": "8.5.2", + "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", + "rxjs": "7.8.1", + "sass": "1.85.0", + "sass-loader": "16.0.5", + "semver": "7.7.1", + "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", - "text-table": "0.2.0", + "terser": "5.39.0", "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.74.0", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", + "tslib": "2.8.1", + "webpack": "5.98.0", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.0", + "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.15.5" + "esbuild": "0.25.1" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "@angular/localize": "^14.0.0", - "@angular/service-worker": "^14.0.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.8", + "@web/test-runner": "^0.20.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^14.0.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.6.2 <4.9" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { "optional": true }, + "@angular/platform-server": { + "optional": true + }, "@angular/service-worker": { "optional": true }, + "@angular/ssr": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, "karma": { "optional": true }, @@ -219,85 +222,66 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.10.tgz", - "integrity": "sha512-h+2MaSY7QSvoJ3R+Hvin21jVCfPGOTLdASIUk4Jmq6J3y5BSku3KSSaV8dWoBOBkFCwQyPQMRjiHoHKLpC1K7g==", + "version": "0.1902.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.8.tgz", + "integrity": "sha512-0X7Lou22VV5ZoG9AW9q1+0kqWbaq51vHZg0YnjfqxEZ1gqKXqE4flZHAvUhm92aeRp8O1UH8YqujwqiCGzvCNg==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1402.10", - "rxjs": "6.6.7" + "@angular-devkit/architect": "0.1902.8", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" + "webpack-dev-server": "^5.0.2" } }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.8.tgz", + "integrity": "sha512-kcxUHKf5Hi98r4gAvMP3ntJV8wuQ3/i6wuU9RcMP0UKUt2Rer5Ryis3MPqT92jvVVwg6lhrLIhXsFuWJMiYjXQ==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -306,328 +290,553 @@ } }, "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/schematics": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.10.tgz", - "integrity": "sha512-MMp31KpJTwKHisXOq+6VOXYApq97hZxFaFmZk396X5aIFTCELUwjcezQDk+u2nEs5iK/COUfnN3plGcfJxYhQA==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.8.tgz", + "integrity": "sha512-QsmFuYdAyeCyg9WF/AJBhFXDUfCwmDFTEbsv5t5KPSP6slhk0GoLNZApniiFytU2siRlSxVNpve2uATyYuAYkQ==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "14.2.10", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", + "@angular-devkit/core": "19.2.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", "ora": "5.4.1", - "rxjs": "6.6.7" + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-eslint/builder": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-14.4.0.tgz", - "integrity": "sha512-AhAUFvSg0urtb6Lsowvuxwu6DMXUy0BPwrnfNOBGjRt9vG7F9kgXXAsm5DnIS0GNy/mLZ9mSfa86fv++1e0KUA==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.3.0.tgz", + "integrity": "sha512-j9xNrzZJq29ONSG6EaeQHve0Squkm6u6Dm8fZgWP7crTFOrtLXn7Wxgxuyl9eddpbWY1Ov1gjFuwBVnxIdyAqg==", "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", + "@angular-devkit/core": ">= 19.0.0 < 20.0.0" + }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.4.0.tgz", - "integrity": "sha512-KMHPHd24s0HVvAP/DxSSqhYBWhwW8FgS/r0Uwv8eWpsIdc/z/Chd2ush2SgPchmmquAXTgOZsbEY7ZmW+XkJfQ==", - "dev": true + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.3.0.tgz", + "integrity": "sha512-63Zci4pvnUR1iSkikFlNbShF1tO5HOarYd8fvNfmOZwFfZ/1T3j3bCy9YbE+aM5SYrWqPaPP/OcwZ3wJ8WNvqA==", + "dev": true, + "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-14.4.0.tgz", - "integrity": "sha512-2rZQ4mt7tEUW+lI5jjuj3HWaT4VQtWTG6+LDnmuUmx76m8hqQ7NvFUpOcNDofu5KbEVBP+oF2DA6wjoZOIuSOA==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.3.0.tgz", + "integrity": "sha512-nBLslLI20KnVbqlfNW7GcnI9R6cYCvRGjOE2QYhzxM316ciAQ62tvQuXP9ZVnRBLSKDAVnMeC0eTq9O4ysrxrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/utils": "14.4.0", - "@typescript-eslint/utils": "5.43.0" + "@angular-eslint/bundled-angular-compiler": "19.3.0", + "@angular-eslint/utils": "19.3.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.4.0.tgz", - "integrity": "sha512-d3GM/EU2iWzr+BrITwO4gBf9WfDfuOdTjfinV/zN84oXMFaK2ENo+IP6OEsD9hh36rdPps+m2gFGDdx+rTzBpg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.3.0.tgz", + "integrity": "sha512-WyouppTpOYut+wvv13wlqqZ8EHoDrCZxNfGKuEUYK1BPmQlTB8EIZfQH4iR1rFVS28Rw+XRIiXo1x3oC0SOfnA==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.4.0", - "@angular-eslint/utils": "14.4.0", - "@typescript-eslint/type-utils": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "aria-query": "5.1.3", - "axobject-query": "3.1.1" + "@angular-eslint/bundled-angular-compiler": "19.3.0", + "@angular-eslint/utils": "19.3.0", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/schematics": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-14.4.0.tgz", - "integrity": "sha512-BrGkPug+CZQWOfmNRsJDrEtYJcxvzF/kLlV7RjvIN9Ky5TjUiJVCeafl3VY6COSY32tjlh2GvBdl1AQKWWovbA==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.3.0.tgz", + "integrity": "sha512-Wl5sFQ4t84LUb8mJ2iVfhYFhtF55IugXu7rRhPHtgIu9Ty5s1v3HGUx4LKv51m2kWhPPeFOTmjeBv1APzFlmnQ==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/eslint-plugin": "14.4.0", - "@angular-eslint/eslint-plugin-template": "14.4.0", - "ignore": "5.2.0", - "strip-json-comments": "3.1.1", - "tmp": "0.2.1" - }, - "peerDependencies": { - "@angular/cli": ">= 14.0.0 < 15.0.0" + "@angular-devkit/core": ">= 19.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", + "@angular-eslint/eslint-plugin": "19.3.0", + "@angular-eslint/eslint-plugin-template": "19.3.0", + "ignore": "7.0.3", + "semver": "7.7.1", + "strip-json-comments": "3.1.1" } }, "node_modules/@angular-eslint/template-parser": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-14.4.0.tgz", - "integrity": "sha512-zq888KpQB0YTEK26mkKcT4fs8LDWWT1oAEXU8DrXhvkikS8XavTSHOWJye/bVZR4oJRFCF5YTJV75DEMcGNIpQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.3.0.tgz", + "integrity": "sha512-VxMNgsHXMWbbmZeBuBX5i8pzsSSEaoACVpaE+j8Muk60Am4Mxc0PytJm4n3znBSvI3B7Kq2+vStSRYPkOER4lA==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.4.0", - "eslint-scope": "^7.0.0" + "@angular-eslint/bundled-angular-compiler": "19.3.0", + "eslint-scope": "^8.0.2" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/utils": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-14.4.0.tgz", - "integrity": "sha512-dPHklAVfh+JfueDfXre9Xooq7p5bFyKO2Z6y1agYeofAgHCPIJOPx2AhtFPrOtsc4VXFFiyE9XbowlXh4ogoKQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.3.0.tgz", + "integrity": "sha512-ovvbQh96FIJfepHqLCMdKFkPXr3EbcvYc9kMj9hZyIxs/9/VxwPH7x25mMs4VsL6rXVgH2FgG5kR38UZlcTNNw==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.4.0", - "@typescript-eslint/utils": "5.43.0" + "@angular-eslint/bundled-angular-compiler": "19.3.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular/animations": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.12.tgz", - "integrity": "sha512-gwdnFZkvVUr+enUNfhfCGRGGqNHn1+vTA81apLfHYhJxgjiLUtETc4KTOrQevtDm022pEd+LSrvr8r+7ag+jkw==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.7.tgz", + "integrity": "sha512-2/pdoiZWC5dZSlweu9Kop5yHI4TNlRAXbw5dLzPkzzfqi/eSKy3Xwd4FZlDKtGXljn0O+T6CDtfS3Y+Jnypokw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "14.2.12" + "@angular/common": "19.2.7", + "@angular/core": "19.2.7" } }, - "node_modules/@angular/cdk": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.7.tgz", - "integrity": "sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg==", + "node_modules/@angular/build": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.8.tgz", + "integrity": "sha512-lfg9OZqRZhmaXbmZTjSE24auOskd7XSbWjZsYodGcW4dYfZdCGkI1g2bP/p6EGQqm+8Vw+IHecyzHLtdJNcbpA==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1902.8", + "@babel/core": "7.26.10", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.6", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.3.2", + "browserslist": "^4.23.0", + "esbuild": "0.25.1", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.34.8", + "sass": "1.85.0", + "semver": "7.7.1", + "source-map-support": "0.5.21", + "vite": "6.2.6", + "watchpack": "2.4.2" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.2.6" + }, + "peerDependencies": { + "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.8", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/vite": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "parse5": "^5.0.0" + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@angular/cdk": { + "version": "19.2.10", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.10.tgz", + "integrity": "sha512-lWBKGZtZ2JMB7r/2xLQIVtiMM2B70WJqSWT3sXyzTNzFBHtCQvH2kqdG7RuLr+2OZih4I/SgiBK2i8FzjwRIgA==", + "license": "MIT", + "dependencies": { + "parse5": "^7.1.2", + "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^14.0.0 || ^15.0.0", - "@angular/core": "^14.0.0 || ^15.0.0", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/cli": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.10.tgz", - "integrity": "sha512-gX9sAKOwq4lKdPWeABB7TzKDHdjQXvkUU8NmPJA6mEAVXvm3lhQtFvHDalZstwK8au2LY0LaXTcEtcKYOt3AXQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.8.tgz", + "integrity": "sha512-8/6HBgmqjE8fODFeIIohHVbmCjYlYQj3anvZneEUAGlRbr2IvLUxj7k1/O+9pawEEsOsyjXh5bIvFmEzL19fBw==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "@schematics/angular": "14.2.10", + "@angular-devkit/architect": "0.1902.8", + "@angular-devkit/core": "19.2.8", + "@angular-devkit/schematics": "19.2.8", + "@inquirer/prompts": "7.3.2", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.2.8", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", - "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.2", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.7.1", "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" + "yargs": "17.7.2" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/common": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.12.tgz", - "integrity": "sha512-oZunh9wfInFWhNO1P8uoEs/o4u8kerKMhw8GruywKm1TV7gHDP2Fi5WHGjFqq3XYptgBTPCTSEfyLX6Cwq1PUw==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.7.tgz", + "integrity": "sha512-It6G8ohe0R5J6+YoCB6eDgmMp55+zYlbCIqEq1AoRPVTO7oVn5X65SIRDBlgpx4kzoBLeeYjDt8WUk4qIZ0GLQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "14.2.12", + "@angular/core": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.12.tgz", - "integrity": "sha512-u2MH9+NRwbbFDRNiPWPexed9CnCq9+pGHLuyACSP2uR6Ik68cE6cayeZbIeoEV5vWpda/XsLmJgPJysw7dAZLQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.7.tgz", + "integrity": "sha512-YHXqDX7VVhfZpRa+ljJZW+PONKjg/LGwdGBBGk3955Ww4Ql+Gjrnv0OxFhChUdwCgsl3yTSXfVep29jYCp6dbA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/core": "14.2.12" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" } }, "node_modules/@angular/compiler-cli": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.12.tgz", - "integrity": "sha512-9Gkb9KFkaQPz8XaS8ZwwTioRZ4ywykdAWyceICEi78/Y9ConYrTX2SbFogzI2dPUZU8a04tMlbqTSmHjVbJftQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.7.tgz", + "integrity": "sha512-NMRCqzmDyPx4nZDgdyDtjZqpFJ+Yc0GoDVRwEILXnKA26yHkptoGQHLcasZAOxjCA0uqLuLqNVRG/IwkCoTb2Q==", + "license": "MIT", "dependencies": { - "@babel/core": "^7.17.2", - "chokidar": "^3.0.0", + "@babel/core": "7.26.9", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", - "reflect-metadata": "^0.1.2", + "reflect-metadata": "^0.2.0", "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", "tslib": "^2.3.0", "yargs": "^17.2.1" }, "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/main-ngcc.js" + "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "14.2.12", - "typescript": ">=4.6.2 <4.9" + "@angular/compiler": "19.2.7", + "typescript": ">=5.5 <5.9" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", + "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/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/@angular/compiler-cli/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==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@angular/core": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.12.tgz", - "integrity": "sha512-sGQxU5u4uawwvJa6jOTmGoisJiQ5HIN/RoBw99CmoqZIVyUSg9IRJJC1KVdH8gbpWBNLkElZv21lwJTL/msWyg==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.7.tgz", + "integrity": "sha512-Ft3cTkXNU538wLDNI4qesFLVfDLXCSHq0uSmi53bHJJxddEJmjD73mGkYA4GGPc3NghQiDEcHuNoTZ3EXWbxjg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0" + "zone.js": "~0.15.0" } }, "node_modules/@angular/forms": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.12.tgz", - "integrity": "sha512-7abYlGIT2JnAtutQUlH3fQS6QEpbfftgvsVcZJCyvX0rXL3u2w2vUQkDHJH4YJJp3AHFVCH4/l7R4VcaPnrwvA==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.7.tgz", + "integrity": "sha512-tFPt53Hd8PKBGhYBdrWX/Az14vFddgujYqRX8fSZMTfd1nsgzUyGmpvwI4ftgx3q4esn3q9xeL2jrLhx8CX8EA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "14.2.12", - "@angular/core": "14.2.12", - "@angular/platform-browser": "14.2.12", + "@angular/common": "19.2.7", + "@angular/core": "19.2.7", + "@angular/platform-browser": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.12.tgz", - "integrity": "sha512-YmW6simyEVmpDmbYVUhZ2IxSP6pmsWrV120rB9Y21/BeM39WIXA4NCNirVWlAd/KAKY9O7Sbn1nXI6rSDfhopQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.2.7.tgz", + "integrity": "sha512-+/Pa6NWkunZyHVPi8rAQX+5MmFSE7aBgB9Qs0ZiCymgdJt8aFC/ry0O62k+9s2uxBd//GS1CZSIttwOxOZnZ7w==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" } }, "node_modules/@angular/localize": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-14.2.12.tgz", - "integrity": "sha512-6TTnuvubvYL1LDIJhDfd7ygxTaj0ShTILCDXT4URBhZKQbQ3HAorDqsc6SXqZVGCHdqF0hGTaeN/7zVvgP9kzA==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-19.2.7.tgz", + "integrity": "sha512-uSTjGTjH28wwWR6X6BXpnDAYDAWqjIPLGGOL4kD+qc9Aul/xvyCM+aiGaLiDFLBnwATSdIrJdiqfLyAZKPiBHA==", + "license": "MIT", "dependencies": { - "@babel/core": "7.18.9", - "glob": "8.0.3", + "@babel/core": "7.26.9", + "@types/babel__core": "7.20.5", + "fast-glob": "3.3.3", "yargs": "^17.2.1" }, "bin": { @@ -636,33 +845,34 @@ "localize-translate": "tools/bundles/src/translate/cli.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "14.2.12", - "@angular/compiler-cli": "14.2.12" + "@angular/compiler": "19.2.7", + "@angular/compiler-cli": "19.2.7" } }, "node_modules/@angular/localize/node_modules/@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "convert-source-map": "^1.7.0", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -672,28 +882,36 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@angular/localize/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/@angular/localize/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@angular/platform-browser": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.12.tgz", - "integrity": "sha512-vOarWym8ucl1gjYWCzdwyBha+MTvL381mvTTUu8aUx6nVhHFjv4bvpjlZnZgojecqUPyxOwmPLLHvCZPJVHZYg==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.7.tgz", + "integrity": "sha512-3kwatNyOUzdt3p92f6SRrNEnYbRVTBl7jL3t2wB+6RDWGboJXGjzFjGqpPpdIftTG56uUijPqZXmQ0gpSgtvuQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "14.2.12", - "@angular/common": "14.2.12", - "@angular/core": "14.2.12" + "@angular/animations": "19.2.7", + "@angular/common": "19.2.7", + "@angular/core": "19.2.7" }, "peerDependenciesMeta": { "@angular/animations": { @@ -702,84 +920,85 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.12.tgz", - "integrity": "sha512-oZhNJeaBmgw8+KBSYpKz2RYqEDyETC+HJXH8dwIFcP6BqqwL2NE70FdSR7EnOa5c41MEtTmMCGhrJSFR60x5/w==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.7.tgz", + "integrity": "sha512-x52xcUzx2IK3JElyD73gJ6t7B6Y8F/Imgs9Ob0B+zYpow3RGva5501m0fHUm8UbOXAD0t11kX68MW4fUp+TRTg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "14.2.12", - "@angular/compiler": "14.2.12", - "@angular/core": "14.2.12", - "@angular/platform-browser": "14.2.12" + "@angular/common": "19.2.7", + "@angular/compiler": "19.2.7", + "@angular/core": "19.2.7", + "@angular/platform-browser": "19.2.7" } }, "node_modules/@angular/router": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.12.tgz", - "integrity": "sha512-r5tVus5RJDNc4U2v0jMtjPiAS1xDsVsJ70lS313DgZmBDHIVZP1cWIehdxwgNlGwQQtAA36eG7toBwqUU3gb/A==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.7.tgz", + "integrity": "sha512-tbvDz/gkifgdeQ9CazoLLfSRqHE4FQcwMOglzEE9gNCIFohpcUwRnxqZMRhZ3RE4BVLqUmzk2LmJ3VYDf6RbqA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "14.2.12", - "@angular/core": "14.2.12", - "@angular/platform-browser": "14.2.12", + "@angular/common": "19.2.7", + "@angular/core": "19.2.7", + "@angular/platform-browser": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -789,103 +1008,89 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", - "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -894,14 +1099,26 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", + "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -910,147 +1127,110 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1060,124 +1240,113 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dependencies": { - "@babel/types": "^7.20.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/types": "^7.27.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", - "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1185,13 +1354,15 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1200,83 +1371,79 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.13.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -1284,14 +1451,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1300,14 +1467,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1316,30 +1483,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1348,14 +1516,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -1364,17 +1534,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1383,14 +1552,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1399,15 +1568,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", + "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1416,14 +1584,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1432,71 +1601,86 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1505,37 +1689,47 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1544,97 +1738,129 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1643,13 +1869,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1658,13 +1886,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1673,15 +1903,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1690,13 +1922,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1705,36 +1939,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", - "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1743,13 +1972,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1758,13 +1988,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1773,14 +2004,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1789,13 +2022,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1804,14 +2039,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1820,13 +2055,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1835,15 +2072,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1852,44 +2088,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1898,15 +2105,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1915,16 +2123,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1933,14 +2139,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", + "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.26.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1949,14 +2156,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1965,29 +2173,14 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1996,13 +2189,19 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", - "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2011,29 +2210,24 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "node_modules/@babel/plugin-transform-runtime/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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2042,13 +2236,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2057,18 +2253,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2077,22 +2269,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2101,14 +2285,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", + "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2117,13 +2301,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2132,13 +2317,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2147,13 +2334,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2162,118 +2351,99 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@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", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2283,69 +2453,69 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, + "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", - "debug": "^4.1.0", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -2353,39 +2523,29 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.5", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/types": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", - "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2396,486 +2556,538 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/@coreui/chartjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@coreui/chartjs/-/chartjs-3.0.0.tgz", - "integrity": "sha512-udbvSxanTNltv94lqTMW8bLRXTtzk9G2SrmFdM/7HH+JSaLX2wdQpZ4VIJhyOCRGLCSKHktl29BnW1/uXQecAg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@coreui/chartjs/-/chartjs-4.1.0.tgz", + "integrity": "sha512-EzYUABhRKmJC8P7B0gP2xfcywig7HWTSHHF0H5hwOcJ1f5MZkXVGIdulkINCAKLUuWQopynuErFJS7wb+M0t3A==", + "license": "MIT", "dependencies": { - "@coreui/coreui": "4.0.0", - "chart.js": "^3.4.0" + "@coreui/coreui": "^5.3.0", + "chart.js": "^4.4.7" } }, "node_modules/@coreui/coreui": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@coreui/coreui/-/coreui-4.0.0.tgz", - "integrity": "sha512-8vH6fJrmvCR/Oy5v0E+/1AL3Ygb4jhQ7NXK2fMYWJyK13BePDm9muB3y6S0IdqkpBwjY3hHVwHyt2lJqJdesmQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@coreui/coreui/-/coreui-5.3.1.tgz", + "integrity": "sha512-gHwLILMOh0RmLUbBmXhWF9qrLLjbzyIj6P1/58v//q62zQ03wb6djkiUkdB4bpWPtJViBVrpKsfA82OOItL3Qw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/coreui" + } + ], + "license": "MIT", "peerDependencies": { - "@popperjs/core": "^2.9.2" + "@popperjs/core": "^2.11.8" } }, "node_modules/@coreui/icons": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@coreui/icons/-/icons-2.1.0.tgz", - "integrity": "sha512-3yY9J0088TSY403jwJeP5YERH3RLOvxdhOa4VIQsGOX4fuQZiyVUM+vwlzyCSpgAv9NwKPkCor+gc+JJaYf0TA==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@coreui/icons/-/icons-3.0.1.tgz", + "integrity": "sha512-u9UKEcRMyY9pa4jUoLij8pAR03g5g6TLWV33/Mx2ix8sffyi0eO4fLV8DSTQljDCw938zt7KYog5cVKEAJUxxg==", + "license": "MIT" }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=14.17.0" } }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">=18" } }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=18" } }, - "node_modules/@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2", - "postcss-selector-parser": "^6.0.10" + "node": ">=18" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", "cpu": [ - "loong64" + "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], "dev": true, - "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" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "*" + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "node_modules/@eslint/config-array/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "node_modules/@eslint/config-array/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2883,5375 +3095,5397 @@ "node": "*" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@ngtools/webpack": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.10.tgz", - "integrity": "sha512-sLHapZLVub6mEz5b19tf1VfIV1w3tYfg7FNPLeni79aldxu1FbP1v2WmiFAnMzrswqyK0bhTtxrl+Z/CLKqyoQ==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18" }, - "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "typescript": ">=4.6.2 <4.9", - "webpack": "^5.54.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">= 4" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 8" + "node": "*" } }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "node_modules/@eslint/js": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, + "license": "Apache-2.0", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" }, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18.18.0" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "infer-owner": "^1.0.4" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18.18.0" } }, - "node_modules/@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, + "license": "Apache-2.0", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "node": ">=18.18" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@rollup/plugin-json": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.0.8" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 10.0.0" + "node": ">=18.18" }, - "peerDependencies": { - "rollup": "^2.42.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/@inquirer/checkbox": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz", + "integrity": "sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">= 8.0.0" + "node": ">=18" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@schematics/angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.10.tgz", - "integrity": "sha512-YFTc/9QJdx422XcApizEcVLKoyknu8b9zHIlAepZCu7WkV8GPT0hvVEHQ7KBWys5aQ7pPZMT0JpZLeAz0F2xYQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "jsonc-parser": "3.1.0" + "@types/node": ">=18" }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/jasmine": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.0.tgz", - "integrity": "sha512-u1jWakf8CWvLfSEZyxmzkgBzOEvXH/szpT0e6G8BTkx5Eu0BhDn7sbc5dz0JBN/6Wwm9rBe+JAsk9tJRyH9ZkA==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true - }, - "node_modules/@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", - "dev": true, - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.18.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.4.tgz", - "integrity": "sha512-9qGjJ5GyShZjUfx2ArBIGM+xExdfLvvaCyQR0t6yRXKPcWCVYF/WemtX/uIU3r7FYECXRXkIiw2Vnhn6y8d+pw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "dependencies": { - "@types/node": "*" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz", - "integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==", + "node_modules/@inquirer/confirm": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/type-utils": "5.45.0", - "@typescript-eslint/utils": "5.45.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { "optional": true } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz", - "integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==", + "node_modules/@inquirer/core": { + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", + "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.45.0", - "@typescript-eslint/utils": "5.45.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "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" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "*" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { "optional": true } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz", - "integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==", + "node_modules/@inquirer/editor": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.10.tgz", + "integrity": "sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "external-editor": "^3.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/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/@inquirer/expand": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.12.tgz", + "integrity": "sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/@inquirer/figures": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", + "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=18" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", - "integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==", + "node_modules/@inquirer/input": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.9.tgz", + "integrity": "sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", - "debug": "^4.3.4" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { "optional": true } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz", - "integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==", + "node_modules/@inquirer/number": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.12.tgz", + "integrity": "sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", - "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "node_modules/@inquirer/password": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.12.tgz", + "integrity": "sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "*" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { "optional": true } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "node_modules/@inquirer/prompts": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "node_modules/@inquirer/rawlist": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.12.tgz", + "integrity": "sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@types/node": ">=18" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { "optional": true } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "node_modules/@inquirer/search": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.12.tgz", + "integrity": "sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", - "integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "@types/node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz", - "integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==", + "node_modules/@inquirer/select": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.1.1.tgz", + "integrity": "sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@types/node": ">=18" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { "optional": true } } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", - "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "node_modules/@inquirer/type": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", + "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/typescript-estree": "5.43.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", - "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=12" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@typescript-eslint/utils/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/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "license": "ISC", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "minipass": "^7.0.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", - "integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==", - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.45.0", - "eslint-visitor-keys": "^3.3.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.0.0" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", + "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@xtuc/long": "4.2.2" + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } + "license": "MIT" }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", + "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@inquirer/type": "^1.5.5" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "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": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "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, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", + "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", + "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", + "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", + "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", + "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@lmdb/lmdb-win32-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", + "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], "dev": true, - "peerDependencies": { - "acorn": "^8" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8.9" + "node": ">= 10" } }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8.9.0" + "node": ">= 10" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "debug": "4" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 6.0.0" + "node": ">= 10" } }, - "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8.0.0" + "node": ">= 10" } }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", + "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "cpu": [ + "riscv64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "cpu": [ + "x64" + ], "dev": true, - "engines": [ - "node >= 0.8.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" ], - "bin": { - "ansi-html": "bin/ansi-html" + "engines": { + "node": ">= 10" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", + "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngtools/webpack": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.8.tgz", + "integrity": "sha512-PBuEadA1bM3BYqo49FdXIgehgEGMSnPmbfmeMC5xRtOXNw8Ear2ogjqPoOj45L98grcS2XyJPlctC7C8kQpA+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "typescript": ">=5.5 <5.9", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dev": true, + "license": "ISC", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@npmcli/agent/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/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dev": true, + "license": "ISC", "dependencies": { - "sprintf-js": "~1.0.2" + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", "dev": true, + "license": "ISC", "dependencies": { - "deep-equal": "^2.0.5" + "@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", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "node_modules/@npmcli/git/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/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, "bin": { - "atob": "bin/atob.js" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 4.5.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], + "license": "ISC", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "bin": { - "autoprefixer": "bin/autoprefixer" + "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "node_modules/@npmcli/package-json": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", "dev": true, + "license": "ISC", "dependencies": { - "deep-equal": "^2.0.5" + "@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", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "node_modules/@npmcli/package-json/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", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">= 8.9" + "bin": { + "glob": "dist/esm/bin.mjs" }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/babel-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", + "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", "dev": true, + "license": "ISC", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "which": "^5.0.0" }, "engines": { - "node": ">=8.9.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "isexe": "^3.1.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@npmcli/redact": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@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" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "isexe": "^3.1.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^4.5.0 || >= 5.9" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "*" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "ms": "2.0.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], "dev": true, - "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", + "optional": true, + "os": [ + "linux" ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 10.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "semver": "^7.0.0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "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, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "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, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT", + "optional": true }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=6" + "node": ">=14" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001435", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz", - "integrity": "sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@rollup/pluginutils": "^5.1.0" }, "engines": { - "node": ">=4" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chart.js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", - "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" }, "engines": { - "node": ">= 8.10.0" + "node": ">=14.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">=10" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/wasm-node": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.40.0.tgz", + "integrity": "sha512-TrH9Uwkd+ZAZIaZAceS842hZFig6s7cWJTFmrj/VqMgCmqgkxFjpMqlk8s3cdrIrsCXRshxWlKeys8xpqqA6xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">=6.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@schematics/angular": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.8.tgz", + "integrity": "sha512-oE/RzC9a0kS6+T72zX08Qkh42tbHlPZxFx1lm3saIzU9mifxlQRT9Od4PK+yksDBvxvtr+TcM2KVOqxCujpHXg==", "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.8", + "@angular-devkit/schematics": "19.2.8", + "jsonc-parser": "3.3.1" + }, "engines": { - "node": ">=6" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/cli-cursor": { + "node_modules/@sigstore/bundle": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "restore-cursor": "^3.1.0" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.1.tgz", + "integrity": "sha512-7MJXQhIm7dWF9zo7rRtMYh8d2gSnc3+JddeQOTIg6gUN7FjcuckZ9EwGq+ReeQtbbl3Tbf5YqRrWxA1DMfIn+w==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 10" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, + "license": "Apache-2.0", + "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": ">=0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/@sigstore/tuf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", + "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "tuf-js": "^3.0.1" }, "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@sigstore/verify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", + "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-name": "1.1.3" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "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==", "dev": true, - "bin": { - "color-support": "bin.js" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" }, - "node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || >=14" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", "dev": true, + "license": "MIT", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" }, "engines": { - "node": ">= 0.6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" + "@babel/types": "^7.20.7" } }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "engines": { - "node": ">=0.8" + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@types/node": "*" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" + "@types/node": "*" } }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, - "engines": { - "node": ">= 0.6" + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, - "engines": { - "node": ">= 0.6" + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "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 - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, + "license": "MIT", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "@types/node": "*" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "node_modules/@types/jasmine": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.7.tgz", + "integrity": "sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==", + "dev": true, + "license": "MIT" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "dev": true, + "license": "MIT", "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" + "@types/lodash": "*" } }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "node_modules/@types/node": { + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", - "pretty-bytes": "^5.3.0" + "undici-types": "~6.21.0" } }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/node": "*" } }, - "node_modules/critters/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/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "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" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/express": "*" } }, - "node_modules/critters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/critters/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@types/node": "*" } }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", + "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/type-utils": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.4" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">= 4" } }, - "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "node_modules/@typescript-eslint/parser": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", + "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4" }, "engines": { - "node": ">= 12.13.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "webpack": "^5.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", "dev": true, - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", + "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "node_modules/@typescript-eslint/types": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/cssdb": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.2.0.tgz", - "integrity": "sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "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.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/@typescript-eslint/utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", + "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", "dev": true, - "bin": { - "cssesc": "bin/cssesc" + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1" }, "engines": { - "node": ">=4" + "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 <5.9.0" } }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", + "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "@typescript-eslint/types": "8.30.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=6.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-equal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", - "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "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/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, - "engines": { - "node": ">= 0.8" + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "engines": { - "node": ">= 0.6.0" + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "license": "BSD-3-Clause" }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" - }, - "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/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/accepts/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": ">= 4" + "node": ">= 0.6" } }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.4.0" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.9" } }, - "node_modules/engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=8.9.0" } }, - "node_modules/engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">= 14" } }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "prr": "~1.0.1" + "ajv": "^8.0.0" }, - "bin": { - "errno": "cli.js" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "node_modules/angular-eslint": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-19.3.0.tgz", + "integrity": "sha512-19hkkH3z/2wGhKk3LfttEBkl6CtQP/tFK6/mJoO/MbIkXV0SSJWtbPbOpEaxICLlfCw0oR6W9OoQqByWkwXjkQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "@angular-devkit/core": ">= 19.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", + "@angular-eslint/builder": "19.3.0", + "@angular-eslint/eslint-plugin": "19.3.0", + "@angular-eslint/eslint-plugin-template": "19.3.0", + "@angular-eslint/schematics": "19.3.0", + "@angular-eslint/template-parser": "19.3.0", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" } }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" }, "engines": { - "node": ">=12" + "node": ">=8" }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "cpu": [ - "arm64" - ], + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, - "optional": true, - "os": [ - "android" + "engines": [ + "node >= 0.8.0" ], - "engines": { - "node": ">=12" + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "cpu": [ - "x64" - ], + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "cpu": [ - "x64" - ], + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "cpu": [ - "arm64" - ], + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "cpu": [ - "ia32" - ], + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "license": "Python-2.0" }, - "node_modules/esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "cpu": [ - "x64" - ], + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "cpu": [ - "arm" - ], + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true, - "optional": true, - "os": [ - "linux" + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "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.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, "engines": { - "node": ">=12" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "cpu": [ - "arm64" - ], + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "cpu": [ - "mips64el" - ], + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "cpu": [ - "ppc64" - ], + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "cpu": [ - "riscv64" - ], + "node_modules/babel-plugin-polyfill-corejs2/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, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "cpu": [ - "s390x" - ], + "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==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "cpu": [ - "x64" - ], + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "cpu": [ - "x64" - ], + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "cpu": [ - "x64" - ], + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, - "optional": true, - "os": [ - "sunos" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": "^4.5.0 || >= 5.9" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "cpu": [ - "ia32" - ], + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "cpu": [ - "x64" - ], + "node_modules/beasties": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.2.tgz", + "integrity": "sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "cpu": [ - "arm64" - ], + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "node_modules/bl/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": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 6" } }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/bl/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==", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "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": { - "eslint-visitor-keys": "^2.0.0" + "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": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } + "license": "MIT" }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "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" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "license": "ISC" }, - "node_modules/eslint/node_modules/argparse": { + "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, - "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, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=7.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "run-applescript": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "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": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=18" } }, - "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==", + "node_modules/cacache/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", "dependencies": { - "argparse": "^2.0.1" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "node_modules/cacache/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/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "dependencies": { - "p-locate": "^5.0.0" + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@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": "*" + "node": ">=18" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/caniuse-lite": { + "version": "1.0.30001714", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz", + "integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/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/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, + "node_modules/chart.js": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", + "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "@kurkle/color": "^0.3.0" }, "engines": { - "node": ">=0.10" + "pnpm": ">=8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=4.0" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { - "node": ">=4.0" + "node": ">=10" } }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">=12" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, + "node_modules/cliui/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/cliui/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", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/cliui/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", "dependencies": { - "ms": "2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.8" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { - "os-tmpdir": "~1.0.2" + "isobject": "^3.0.1" }, "engines": { - "node": ">=0.6.0" + "node": ">=0.10.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8.6.0" + "node": ">=7.0.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, - "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } + "license": "MIT" }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "dev": true, + "license": "MIT", "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8.0" } }, - "node_modules/finalhandler/node_modules/debug": { + "node_modules/compression/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/finalhandler/node_modules/ms": { + "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 0.10.0" } }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "license": "MIT", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=0.8" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "ms": "2.0.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { "node": ">= 0.6" } }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "node": ">= 0.6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/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==", + "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/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "is-what": "^3.14.1" }, - "engines": { - "node": ">=6 <7 || >=8" + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "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==" + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/copyfiles/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/copyfiles/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } + "node_modules/copyfiles/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/copyfiles/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=8" } }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "node_modules/copyfiles/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "*" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/copyfiles/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.0.0" + "node": ">=8" } }, - "node_modules/get-stream": { + "node_modules/copyfiles/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "node_modules/copyfiles/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/copyfiles/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, + "license": "ISC", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "browserslist": "^4.24.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { + "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.10" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 8" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, "engines": { - "node": ">= 0.4" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "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/ljharb" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/hdr-histogram-percentiles-obj": { + "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "node": ">=4" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "license": "MIT" }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "license": "MIT", + "engines": { + "node": ">=4.0" } }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "license": "MIT" }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy-agent": { + "node_modules/default-browser-id": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" + "clone": "^1.0.2" }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">= 0.8" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, - "dependencies": { - "ms": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "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==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, + "license": "Apache-2.0", + "optional": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=8" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "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" }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true, - "engines": { - "node": ">= 4" - } + "license": "MIT" }, - "node_modules/ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "license": "MIT", "dependencies": { - "minimatch": "^5.0.1" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=6" + "node": ">= 4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "engines": { - "node": ">=4" + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 0.4" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" }, - "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==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } + "node_modules/electron-to-chromium": { + "version": "1.5.138", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.138.tgz", + "integrity": "sha512-FWlQc52z1dXqm+9cCJ2uyFgJkESd+16j6dBEjsgDNuHjBpuIzL8/lRc0uvh1k8RNI6waGo6tcy2DvwkTBJOLDg==", + "license": "ISC" }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" }, - "node_modules/ini": { + "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/injection-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" + "node": ">= 4" } }, - "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "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, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">= 0.8" } }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "iconv-lite": "^0.6.2" } }, - "node_modules/inquirer/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/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=10.2.0" } }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, "engines": { - "node": ">= 10" + "node": ">=10.13.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "has": "^1.0.3" + "prr": "~1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "errno": "cli.js" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-arrayish": "^0.2.1" } }, - "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/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "bin": { - "is-docker": "cli.js" - }, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "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==", - "engines": { - "node": ">=8" - } + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "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/esbuild": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "node_modules/esbuild-wasm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.1.tgz", + "integrity": "sha512-dZxPeDHcDIQ6ilml/NzYxnPbNkoVsHSFH3JGLSobttc5qYYgExMo8lh2XcB+w+AfiqykVDGK5PWanGB0gWaAWw==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=0.12.0" + "node": ">=18" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8259,15614 +8493,8234 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/eslint": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", + "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", "dev": true, + "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.24.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "engines": { - "node": ">=8" + "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": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", "dependencies": { - "has-symbols": "^1.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "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/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "estraverse": "^5.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10" } }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "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/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "is-docker": "^2.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" + "node": ">=4.0" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, + "license": "MIT" + }, + "node_modules/events": { + "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": ">=8" + "node": ">=0.8.x" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "license": "Apache-2.0" }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "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": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "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": ">=8" + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/express/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": ">=8" + "node": ">= 0.6" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/express/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": { - "has-flag": "^4.0.0" - }, + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/express/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": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "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": ">=10" + "node": ">= 0.8" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "node_modules/express/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, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "engines": { - "node": ">= 10.13.0" + "node": ">=4" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "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.8" + }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, - "node_modules/jest-worker/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, + "node_modules/fast-glob/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": { - "has-flag": "^4.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 6" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } + "license": "MIT" }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, - "node_modules/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==", + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "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 - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", - "dev": true, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { - "which": "^1.2.1" + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">= 0.8" } }, - "node_modules/karma-coverage": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", - "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", + "node_modules/finalhandler/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": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.0.0" + "ms": "2.0.0" } }, - "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/finalhandler/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/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/karma-coverage/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": "*" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { - "jasmine-core": "^4.1.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, - "peerDependencies": { - "karma": "^6.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", - "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "peerDependencies": { - "jasmine-core": "^4.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { - "source-map-support": "^0.5.5" + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "ISC" }, - "node_modules/karma/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, - "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" + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "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", + "signal-exit": "^4.0.1" }, "engines": { - "node": "*" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.6" } }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/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, - "dependencies": { - "minimist": "^1.2.6" + "license": "MIT", + "engines": { + "node": "*" }, - "bin": { - "mkdirp": "bin/cmd.js" + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/karma/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/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.10.0" + "node": ">= 0.6" } }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/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": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=6 <7 || >=8" } }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { - "klona": "^2.0.4" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/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, - "optional": true, - "bin": { - "mime": "cli.js" + "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": ">=4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "optional": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, - "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } + "license": "BSD-2-Clause" }, - "node_modules/less/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.8.0" + "node": "*" } }, - "node_modules/license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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", "dependencies": { - "webpack-sources": "^3.0.0" + "@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" }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6.11.5" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "engines": { - "node": ">= 12.13.0" - } + "license": "ISC" }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "license": "MIT" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/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/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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": { - "color-name": "~1.1.4" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=7.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/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==", + "dev": true, + "license": "ISC" }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/log4js": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.7.1.tgz", - "integrity": "sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ==", + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.3" - }, - "engines": { - "node": ">=8.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "license": "BSD-2-Clause" }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "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==", + "node_modules/http-errors/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.6" + "node": ">= 0.8" } }, - "node_modules/memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "dev": true, - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=8.0.0" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">= 0.6" + "node": ">= 14" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/http-proxy-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", + "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=8.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, - "bin": { - "mime": "cli.js" + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">=4.0.0" + "node": ">= 14" } }, - "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/hyperdyperid": { + "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": ">= 0.6" + "node": ">=10.18" } }, - "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/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": { - "mime-db": "1.52.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { - "node": ">=6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "dependencies": { - "schema-utils": "^4.0.0" - }, + "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": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">= 4" } }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/ignore-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", "dev": true, + "license": "ISC", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "minimatch": "^9.0.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "node_modules/immutable": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", + "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=0.8.19" } }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "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.", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "node_modules/injection-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", + "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", "dev": true, + "license": "MIT", "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "tslib": "^2.0.0" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": ">=8" + "node": ">= 12" } }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { - "mkdirp": "bin/cmd.js" + "is-docker": "cli.js" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "license": "MIT", + "engines": { + "node": ">=12" }, - "bin": { - "multicast-dns": "cli.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=0.10.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" + "is-docker": "^3.0.0" }, "bin": { - "needle": "bin/needle" + "is-inside-container": "cli.js" }, "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/needle/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==", + "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, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/ng-packagr": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-14.2.2.tgz", - "integrity": "sha512-AqwHcMM6x+JkCHT++IsbulnTdyoXcC2Cr4tbPamuieacc77+fFbB195hdcqEFwsKX5410cymx/ZUyHird9rxlg==", - "dev": true, - "dependencies": { - "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^13.1.3", - "ajv": "^8.10.0", - "ansi-colors": "^4.1.1", - "browserslist": "^4.20.0", - "cacache": "^16.0.0", - "chokidar": "^3.5.3", - "commander": "^9.0.0", - "dependency-graph": "^0.11.0", - "esbuild-wasm": "^0.15.0", - "find-cache-dir": "^3.3.2", - "glob": "^8.0.0", - "injection-js": "^2.4.0", - "jsonc-parser": "^3.0.0", - "less": "^4.1.2", - "ora": "^5.1.0", - "postcss": "^8.4.8", - "postcss-preset-env": "^7.4.2", - "postcss-url": "^10.1.3", - "rollup": "^2.70.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rxjs": "^7.5.5", - "sass": "^1.49.9", - "stylus": "^0.59.0" - }, - "bin": { - "ng-packagr": "cli/main.js" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "optionalDependencies": { - "esbuild": "^0.15.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^14.0.0 || ^14.0.0-next || ^14.2.0-next", - "tslib": "^2.3.0", - "typescript": ">=4.6.2 <4.9" + "node": ">=0.12.0" } }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "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==", + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6.13.0" + "node": ">=0.10.0" } }, - "node_modules/node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "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, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "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" + "is-inside-container": "^1.0.0" }, "engines": { - "node": "*" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "node": ">= 8.0.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, + "license": "BSD-3-Clause", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm-packlist/node_modules/npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "npm-normalize-package-bin": "^2.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "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, + "license": "BlueOak-1.0.0", "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.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==", + "node_modules/jasmine-core": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.6.0.tgz", + "integrity": "sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA==", "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 10.13.0" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/jest-worker/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": { - "boolbase": "^1.0.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" } }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, - "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" - } + "license": "MIT" }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" }, - "engines": { - "node": ">=10" + "bin": { + "karma": "bin/karma" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 10" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "which": "^1.2.1" } }, - "node_modules/ora/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/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "bin": { + "which": "bin/which" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=7.0.0" + "node": ">=10.0.0" } }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/karma-coverage/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, "engines": { "node": ">=8" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/karma-coverage/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": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/karma-coverage/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, - "engines": { - "node": ">=0.10.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "jasmine-core": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "karma": "^6.0.0" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "license": "MIT", + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, + "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "source-map-support": "^0.5.5" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "node_modules/karma/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "engines": { - "node": ">= 4" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/karma/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=6" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/karma/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { - "callsites": "^3.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 0.10" + "node": "*" } }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "optional": true - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "node_modules/karma/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "node_modules/karma/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "parse5": "^6.0.1" + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "node_modules/karma/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { - "parse5": "^6.0.1" + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "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/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==", + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/karma/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.14" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=10" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, - "optionalDependencies": { - "nice-napi": "^1.0.2" + "json-buffer": "3.0.1" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.4", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "shell-quote": "^1.8.1" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "node_modules/less": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", + "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" }, - "engines": { - "node": "^12 || ^14 || >=16" + "bin": { + "lessc": "bin/lessc" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "engines": { + "node": ">=6" }, - "peerDependencies": { - "postcss": "^8.2" + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" } }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "node_modules/less-loader": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", "engines": { - "node": ">=7.6.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "postcss": "^8.4.6" + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=6" } }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=4" } }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=0.10.0" } }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">= 0.8.0" } }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, + "license": "ISC", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "webpack-sources": "^3.0.0" }, - "peerDependencies": { - "postcss": "^8.2" + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } } }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">=18.0.0" } }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "node_modules/lmdb": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", + "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" }, - "engines": { - "node": "^12 || ^14 || >=16" + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, - "peerDependencies": { - "postcss": "^8.4" + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.2.6", + "@lmdb/lmdb-darwin-x64": "3.2.6", + "@lmdb/lmdb-linux-arm": "3.2.6", + "@lmdb/lmdb-linux-arm64": "3.2.6", + "@lmdb/lmdb-linux-x64": "3.2.6", + "@lmdb/lmdb-win32-x64": "3.2.6" } }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" } }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9" + "p-locate": "^5.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" - } + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "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": "^12 || ^14 || >=16" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "environment": "^1.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "get-east-asian-width": "^1.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "license": "MIT", "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=18" }, - "peerDependencies": { - "postcss": "^8.4" - } + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, - "engines": { - "node": ">=10.0.0" + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=8.0" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/postcss-modules-local-by-default": { + "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "semver": "^7.5.3" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "dev": true, + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.4" } }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "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/memfs": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 4.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "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, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 8" } }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" }, - "peerDependencies": { - "postcss": "^8.2" + "engines": { + "node": ">=4.0.0" } }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "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, - "peerDependencies": { - "postcss": "^8" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "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": { - "postcss-value-parser": "^4.2.0" + "mime-db": "1.52.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dev": true, - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "postcss": "^8.2" + "webpack": "^5.0.0" } }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, - "peerDependencies": { - "postcss": "^8.0.3" - } + "license": "ISC" }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "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": { - "postcss-selector-parser": "^6.0.10" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-url": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "dependencies": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" - }, + "license": "ISC", "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/postcss-url/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/postcss-url/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true, - "bin": { - "mime": "cli.js" + "minipass": "^7.0.3" }, "engines": { - "node": ">=4.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/postcss-url/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" }, "engines": { - "node": "*" + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 8" } }, - "node_modules/prettier": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", - "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=8" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "engines": { - "node": ">=6" + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, "engines": { - "node": ">= 0.10" + "node": ">= 18" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "optional": true + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", + "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", "dev": true, - "engines": { - "node": ">=0.9" + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "side-channel": "^1.0.4" + "node-gyp-build-optional-packages": "5.2.2" }, - "engines": { - "node": ">=0.6" + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">= 0.8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "dependencies": { - "pify": "^2.3.0" - } + "license": "MIT" }, - "node_modules/read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 4.4.x" } }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.6" } }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/ng-packagr": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.2.2.tgz", + "integrity": "sha512-dFuwFsDJMBSd1YtmLLcX5bNNUCQUlRqgf34aXA+79PmkOP+0eF8GP2949wq3+jMjmFTNm80Oo8IUYiSLwklKCQ==", + "dev": true, + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "@rollup/plugin-json": "^6.1.0", + "@rollup/wasm-node": "^4.24.0", + "ajv": "^8.17.1", + "ansi-colors": "^4.1.3", + "browserslist": "^4.22.1", + "chokidar": "^4.0.1", + "commander": "^13.0.0", + "convert-source-map": "^2.0.0", + "dependency-graph": "^1.0.0", + "esbuild": "^0.25.0", + "fast-glob": "^3.3.2", + "find-cache-dir": "^3.3.2", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.3.1", + "less": "^4.2.0", + "ora": "^5.1.0", + "piscina": "^4.7.0", + "postcss": "^8.4.47", + "rxjs": "^7.8.1", + "sass": "^1.81.0" + }, + "bin": { + "ng-packagr": "cli/main.js" }, "engines": { - "node": ">=8.10.0" + "node": "^18.19.1 || >=20.11.1" + }, + "optionalDependencies": { + "rollup": "^4.24.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.5 <5.9" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } } }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "node_modules/ng-packagr/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/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "node_modules/ng-packagr/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "node_modules/ng-packagr/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.8.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true + "node_modules/ng-packagr/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/ng-packagr/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "semver": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/ng-packagr/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "node_modules/ng-packagr/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/ng-packagr/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { - "jsesc": "~0.5.0" + "find-up": "^4.0.0" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">=8" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "node_modules/ng-packagr/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": { - "jsesc": "bin/jsesc" + "semver": "bin/semver.js" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": ">=0.10.0" + "node": ">= 6.13.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/node-gyp": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", + "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", "dev": true, + "license": "MIT", + "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", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "detect-libc": "^2.0.1" }, "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, + "license": "ISC", "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/resolve-url-loader/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/node-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", + "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": ">=0.10.0" + "node": ">=18" } }, - "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/node-gyp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 4" + "node": ">=18" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, + "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "abbrev": "^3.0.0" }, "bin": { - "rimraf": "bin.js" + "nopt": "bin/nopt.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "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" - }, + "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "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==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "node_modules/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/rollup-plugin-sourcemaps": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", - "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", + "node_modules/npm-install-checks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", + "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@rollup/pluginutils": "^3.0.9", - "source-map-resolve": "^0.6.0" + "semver": "^7.1.1" }, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "@types/node": ">=10.0.0", - "rollup": ">=0.31.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", "dev": true, + "license": "ISC", "engines": { - "node": ">=0.12.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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, - "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": "ISC", "dependencies": { - "queue-microtask": "^1.2.2" + "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/rxjs": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", - "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "node_modules/npm-packlist": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", + "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", + "dev": true, + "license": "ISC", "dependencies": { - "tslib": "^2.1.0" + "ignore-walk": "^7.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/safe-buffer": { - "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", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", "dev": true, + "license": "ISC", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=12.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", "dev": true, + "license": "ISC", "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, + "license": "MIT", "engines": { - "node": ">= 8.9.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ee-first": "1.1.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 0.8" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/schema-utils/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 - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" + "wrappy": "1" } }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "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" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/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 - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/ora/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": { - "randombytes": "^2.1.0" + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/ora/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": { - "ms": "2.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/ora/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, - "engines": { - "node": ">= 0.6" - } + "license": "ISC" }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "node_modules/ordered-binary": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "dev": true, + "license": "MIT", + "optional": true }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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 - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=6" } }, - "node_modules/socket.io": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", - "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.1", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.1" + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", + "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", + "dev": true, + "license": "ISC", + "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": ">=10.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "node_modules/parse-json/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" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "license": "MIT", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, + "license": "MIT", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/socks-proxy-agent": { + "node_modules/parse5-sax-parser": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "parse5": "^7.0.0" }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 0.8" } }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, + "license": "MIT", "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" + "node": ">=8" } }, - "node_modules/source-map-loader/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==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "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, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } + "license": "ISC" }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "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, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } + "license": "MIT" }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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", "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true + "node_modules/piscina": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "find-up": "^6.3.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.1.1" + "p-locate": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/streamroller": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", - "integrity": "sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=8.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/pkg-dir/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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", + "node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" + "node": "^10 || ^12 || >=14" } }, - "node_modules/stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, + "license": "MIT", "dependencies": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "stylus": ">=0.52.4", + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/stylus/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/stylus/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "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" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "*" + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/stylus/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "icss-utils": "^5.0.0" }, "engines": { - "node": "*" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">=0.10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { "node": ">=10" } }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, + "license": "MIT", "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "node": ">= 0.10" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, - "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" - } + "license": "MIT", + "optional": true }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } + "license": "MIT" }, - "node_modules/terser-webpack-plugin/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 + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "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": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 10.13.0" + "node": ">=0.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" }, - "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==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" + "safe-buffer": "^5.1.0" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": { - "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" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.8" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, + "license": "MIT", "dependencies": { - "rimraf": "^3.0.0" + "regenerate": "^1.4.2" }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "license": "MIT" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "@babel/runtime": "^7.8.4" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "dev": true, + "license": "MIT" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "jsesc": "~3.0.2" }, - "engines": { - "node": ">= 0.6" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4.2.0" + "node": ">=6" } }, - "node_modules/ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, + "license": "MIT", "dependencies": { - "unique-slug": "^2.0.0" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "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, + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=8.9.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/resolve-url-loader/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.8" + "node": ">=0.10.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, - "bin": { - "browserslist-lint": "cli.js" + "engines": { + "node": ">=18" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "dependencies": { - "punycode": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "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==", - "dev": true - }, - "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, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { - "node": ">= 0.4.0" + "iojs": ">=1.0.0", + "node": ">=0.10.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==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } + "license": "MIT" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "node_modules/rollup": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", "dev": true, + "license": "MIT", "dependencies": { - "builtins": "^5.0.0" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", + "fsevents": "~2.3.2" } }, - "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==", + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", "dependencies": { - "minimalistic-assert": "^1.0.0" + "tslib": "^2.1.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/safe-buffer": { + "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, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "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": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": 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" }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">=14.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "webpack-cli": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { "optional": true } } }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "engines": { - "node": ">=10.0.0" + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "ajv": "^8.0.0" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "ajv": { "optional": true } } }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, + "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "@types/node-forge": "^1.3.0", + "node-forge": "^1" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=10.13.0" + "node": ">=10" } }, - "node_modules/webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "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": { - "typed-assert": "^1.0.8" + "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": ">= 12" - }, - "peerDependencies": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } + "node": ">= 0.8.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/send/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": { - "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" + "ms": "2.0.0" } }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/send/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, - "peerDependencies": { - "ajv": "^6.9.1" - } + "license": "MIT" }, - "node_modules/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==", + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/send/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": ">=4.0" + "node": ">= 0.8" } }, - "node_modules/webpack/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 + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 0.8.0" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/serve-index/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": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" + "ms": "2.0.0" } }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.6" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/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/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "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": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "kind-of": "^6.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { + "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "engines": { - "node": ">=10.0.0" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "dependencies": { - "cuint": "^0.2.2" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/sigstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "dev": true, + "license": "Apache-2.0", + "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": ">=10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "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", "engines": { - "node": ">= 6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" } - } - }, - "dependencies": { - "@adobe/css-tools": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", - "dev": true }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", - "dev": true, - "requires": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" } }, - "@angular-devkit/build-angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.10.tgz", - "integrity": "sha512-VCeZAyq4uPCJukKInaSiD4i/GgxgcU4jFlLFQtoYNmaBS4xbPOymL19forRIihiV0dwNEa2L694vRTAPMBxIfw==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/build-webpack": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.10", - "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", - "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild": "0.15.5", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.0.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", - "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", - "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.74.0", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "5.1.0" - }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@angular-devkit/build-webpack": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.10.tgz", - "integrity": "sha512-h+2MaSY7QSvoJ3R+Hvin21jVCfPGOTLdASIUk4Jmq6J3y5BSku3KSSaV8dWoBOBkFCwQyPQMRjiHoHKLpC1K7g==", + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, - "requires": { - "@angular-devkit/architect": "0.1402.10", - "rxjs": "6.6.7" - }, + "license": "MIT", "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" } }, - "@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, + "license": "MIT", "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@angular-devkit/schematics": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.10.tgz", - "integrity": "sha512-MMp31KpJTwKHisXOq+6VOXYApq97hZxFaFmZk396X5aIFTCELUwjcezQDk+u2nEs5iK/COUfnN3plGcfJxYhQA==", + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, - "requires": { - "@angular-devkit/core": "14.2.10", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, + "license": "MIT", "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@angular-eslint/builder": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-14.4.0.tgz", - "integrity": "sha512-AhAUFvSg0urtb6Lsowvuxwu6DMXUy0BPwrnfNOBGjRt9vG7F9kgXXAsm5DnIS0GNy/mLZ9mSfa86fv++1e0KUA==", - "dev": true, - "requires": {} - }, - "@angular-eslint/bundled-angular-compiler": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.4.0.tgz", - "integrity": "sha512-KMHPHd24s0HVvAP/DxSSqhYBWhwW8FgS/r0Uwv8eWpsIdc/z/Chd2ush2SgPchmmquAXTgOZsbEY7ZmW+XkJfQ==", - "dev": true - }, - "@angular-eslint/eslint-plugin": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-14.4.0.tgz", - "integrity": "sha512-2rZQ4mt7tEUW+lI5jjuj3HWaT4VQtWTG6+LDnmuUmx76m8hqQ7NvFUpOcNDofu5KbEVBP+oF2DA6wjoZOIuSOA==", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "requires": { - "@angular-eslint/utils": "14.4.0", - "@typescript-eslint/utils": "5.43.0" + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "@angular-eslint/eslint-plugin-template": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.4.0.tgz", - "integrity": "sha512-d3GM/EU2iWzr+BrITwO4gBf9WfDfuOdTjfinV/zN84oXMFaK2ENo+IP6OEsD9hh36rdPps+m2gFGDdx+rTzBpg==", + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "14.4.0", - "@angular-eslint/utils": "14.4.0", - "@typescript-eslint/type-utils": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "aria-query": "5.1.3", - "axobject-query": "3.1.1" + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "@angular-eslint/schematics": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-14.4.0.tgz", - "integrity": "sha512-BrGkPug+CZQWOfmNRsJDrEtYJcxvzF/kLlV7RjvIN9Ky5TjUiJVCeafl3VY6COSY32tjlh2GvBdl1AQKWWovbA==", + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, - "requires": { - "@angular-eslint/eslint-plugin": "14.4.0", - "@angular-eslint/eslint-plugin-template": "14.4.0", - "ignore": "5.2.0", - "strip-json-comments": "3.1.1", - "tmp": "0.2.1" + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" } }, - "@angular-eslint/template-parser": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-14.4.0.tgz", - "integrity": "sha512-zq888KpQB0YTEK26mkKcT4fs8LDWWT1oAEXU8DrXhvkikS8XavTSHOWJye/bVZR4oJRFCF5YTJV75DEMcGNIpQ==", + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "14.4.0", - "eslint-scope": "^7.0.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" } }, - "@angular-eslint/utils": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-14.4.0.tgz", - "integrity": "sha512-dPHklAVfh+JfueDfXre9Xooq7p5bFyKO2Z6y1agYeofAgHCPIJOPx2AhtFPrOtsc4VXFFiyE9XbowlXh4ogoKQ==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "14.4.0", - "@typescript-eslint/utils": "5.43.0" - } - }, - "@angular/animations": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.12.tgz", - "integrity": "sha512-gwdnFZkvVUr+enUNfhfCGRGGqNHn1+vTA81apLfHYhJxgjiLUtETc4KTOrQevtDm022pEd+LSrvr8r+7ag+jkw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/cdk": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.7.tgz", - "integrity": "sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg==", - "requires": { - "parse5": "^5.0.0", - "tslib": "^2.3.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "@angular/cli": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.10.tgz", - "integrity": "sha512-gX9sAKOwq4lKdPWeABB7TzKDHdjQXvkUU8NmPJA6mEAVXvm3lhQtFvHDalZstwK8au2LY0LaXTcEtcKYOt3AXQ==", + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, - "requires": { - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "@schematics/angular": "14.2.10", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", - "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", - "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" - } - }, - "@angular/common": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.12.tgz", - "integrity": "sha512-oZunh9wfInFWhNO1P8uoEs/o4u8kerKMhw8GruywKm1TV7gHDP2Fi5WHGjFqq3XYptgBTPCTSEfyLX6Cwq1PUw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.12.tgz", - "integrity": "sha512-u2MH9+NRwbbFDRNiPWPexed9CnCq9+pGHLuyACSP2uR6Ik68cE6cayeZbIeoEV5vWpda/XsLmJgPJysw7dAZLQ==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler-cli": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.12.tgz", - "integrity": "sha512-9Gkb9KFkaQPz8XaS8ZwwTioRZ4ywykdAWyceICEi78/Y9ConYrTX2SbFogzI2dPUZU8a04tMlbqTSmHjVbJftQ==", - "requires": { - "@babel/core": "^7.17.2", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", - "reflect-metadata": "^0.1.2", - "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - } - }, - "@angular/core": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.12.tgz", - "integrity": "sha512-sGQxU5u4uawwvJa6jOTmGoisJiQ5HIN/RoBw99CmoqZIVyUSg9IRJJC1KVdH8gbpWBNLkElZv21lwJTL/msWyg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/forms": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.12.tgz", - "integrity": "sha512-7abYlGIT2JnAtutQUlH3fQS6QEpbfftgvsVcZJCyvX0rXL3u2w2vUQkDHJH4YJJp3AHFVCH4/l7R4VcaPnrwvA==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/language-service": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.12.tgz", - "integrity": "sha512-YmW6simyEVmpDmbYVUhZ2IxSP6pmsWrV120rB9Y21/BeM39WIXA4NCNirVWlAd/KAKY9O7Sbn1nXI6rSDfhopQ==", - "dev": true - }, - "@angular/localize": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-14.2.12.tgz", - "integrity": "sha512-6TTnuvubvYL1LDIJhDfd7ygxTaj0ShTILCDXT4URBhZKQbQ3HAorDqsc6SXqZVGCHdqF0hGTaeN/7zVvgP9kzA==", - "requires": { - "@babel/core": "7.18.9", - "glob": "8.0.3", - "yargs": "^17.2.1" - }, + "license": "MIT", "dependencies": { - "@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@angular/platform-browser": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.12.tgz", - "integrity": "sha512-vOarWym8ucl1gjYWCzdwyBha+MTvL381mvTTUu8aUx6nVhHFjv4bvpjlZnZgojecqUPyxOwmPLLHvCZPJVHZYg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/platform-browser-dynamic": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.12.tgz", - "integrity": "sha512-oZhNJeaBmgw8+KBSYpKz2RYqEDyETC+HJXH8dwIFcP6BqqwL2NE70FdSR7EnOa5c41MEtTmMCGhrJSFR60x5/w==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/router": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.12.tgz", - "integrity": "sha512-r5tVus5RJDNc4U2v0jMtjPiAS1xDsVsJ70lS313DgZmBDHIVZP1cWIehdxwgNlGwQQtAA36eG7toBwqUU3gb/A==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==" - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" } }, - "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "node_modules/source-map-loader/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" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", - "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - } + "license": "CC-BY-3.0" }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } + "license": "CC0-1.0" }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "requires": { - "@babel/types": "^7.18.9" + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "node_modules/spdy-transport/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, - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "node_modules/spdy-transport/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==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "requires": { - "@babel/types": "^7.20.2" - } + "license": "BSD-3-Clause" }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", "dev": true, - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "@babel/parser": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", - "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" } }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } + "license": "MIT" }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } + "license": "MIT" }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "engines": { + "node": ">=0.10" } }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "ISC", + "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" } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "license": "ISC", + "engines": { + "node": ">=8" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } + "license": "ISC" }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "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==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } + "license": "MIT" }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } + "license": "MIT" }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } + "license": "MIT" }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } + "license": "MIT" }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", - "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "engines": { + "node": ">=0.6" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "bin": { + "tree-kill": "cli.js" } }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/tuf-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", + "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "MIT", + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "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, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "license": "MIT" + }, + "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==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/typescript-eslint": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.30.1.tgz", + "integrity": "sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.30.1", + "@typescript-eslint/parser": "8.30.1", + "@typescript-eslint/utils": "8.30.1" + }, + "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 <5.9.0" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "node_modules/ua-parser-js": { + "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" } }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } + "license": "MIT" }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@babel/plugin-transform-parameters": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", - "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" - }, + "license": "MIT", "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - }, + "license": "ISC", "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "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, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "license": "MIT", + "engines": { + "node": ">= 4.0.0" } }, - "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", - "requires": { - "@babel/types": "^7.20.5", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } + "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==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "@babel/types": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", - "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, - "@coreui/chartjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@coreui/chartjs/-/chartjs-3.0.0.tgz", - "integrity": "sha512-udbvSxanTNltv94lqTMW8bLRXTtzk9G2SrmFdM/7HH+JSaLX2wdQpZ4VIJhyOCRGLCSKHktl29BnW1/uXQecAg==", - "requires": { - "@coreui/coreui": "4.0.0", - "chart.js": "^3.4.0" - } - }, - "@coreui/coreui": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@coreui/coreui/-/coreui-4.0.0.tgz", - "integrity": "sha512-8vH6fJrmvCR/Oy5v0E+/1AL3Ygb4jhQ7NXK2fMYWJyK13BePDm9muB3y6S0IdqkpBwjY3hHVwHyt2lJqJdesmQ==", - "requires": {} - }, - "@coreui/icons": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@coreui/icons/-/icons-2.1.0.tgz", - "integrity": "sha512-3yY9J0088TSY403jwJeP5YERH3RLOvxdhOa4VIQsGOX4fuQZiyVUM+vwlzyCSpgAv9NwKPkCor+gc+JJaYf0TA==", - "dev": true - }, - "@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "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, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "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, - "requires": { - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "@csstools/postcss-hwb-function": { + "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } + "license": "MIT" }, - "@csstools/postcss-ic-unit": { + "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "engines": { + "node": ">= 0.4.0" } }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "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, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "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, - "requires": { - "postcss-value-parser": "^4.2.0" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "node_modules/validate-npm-package-name": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", + "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "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, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "node_modules/vite": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz", + "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==", "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.3", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.12" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "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 + } } }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "requires": {} - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true }, - "@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true }, - "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true }, - "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true }, - "@ngtools/webpack": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.10.tgz", - "integrity": "sha512-sLHapZLVub6mEz5b19tf1VfIV1w3tYfg7FNPLeni79aldxu1FbP1v2WmiFAnMzrswqyK0bhTtxrl+Z/CLKqyoQ==", + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", + "cpu": [ + "arm" + ], "dev": true, - "requires": {} + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "node_modules/vite/node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", + "cpu": [ + "loong64" + ], "dev": true, - "requires": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "node_modules/vite/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", + "cpu": [ + "ppc64" + ], "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "cpu": [ + "riscv64" + ], "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", + "cpu": [ + "s390x" + ], "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - } - }, - "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@rollup/plugin-json": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", + "cpu": [ + "ia32" + ], "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true }, - "@schematics/angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.10.tgz", - "integrity": "sha512-YFTc/9QJdx422XcApizEcVLKoyknu8b9zHIlAepZCu7WkV8GPT0hvVEHQ7KBWys5aQ7pPZMT0JpZLeAz0F2xYQ==", + "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "jsonc-parser": "3.1.0" - } - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "node_modules/vite/node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/jasmine": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.0.tgz", - "integrity": "sha512-u1jWakf8CWvLfSEZyxmzkgBzOEvXH/szpT0e6G8BTkx5Eu0BhDn7sbc5dz0JBN/6Wwm9rBe+JAsk9tJRyH9ZkA==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true - }, - "@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", - "dev": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/node": { - "version": "16.18.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.4.tgz", - "integrity": "sha512-9qGjJ5GyShZjUfx2ArBIGM+xExdfLvvaCyQR0t6yRXKPcWCVYF/WemtX/uIU3r7FYECXRXkIiw2Vnhn6y8d+pw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz", - "integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/type-utils": "5.45.0", - "@typescript-eslint/utils": "5.45.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/type-utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz", - "integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.45.0", - "@typescript-eslint/utils": "5.45.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz", - "integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - } - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", - "integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz", - "integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", - "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" - } - } - } - }, - "@typescript-eslint/types": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", - "integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz", - "integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", - "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/typescript-estree": "5.43.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", - "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0" - } - }, - "@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", - "integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.45.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "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, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "requires": { - "deep-equal": "^2.0.5" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "requires": { - "deep-equal": "^2.0.5" - } - }, - "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001435", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz", - "integrity": "sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chart.js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", - "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "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, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "requires": { - "is-what": "^3.14.1" - } - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", - "pretty-bytes": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssdb": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.2.0.tgz", - "integrity": "sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "deep-equal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", - "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "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 - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" - }, - "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==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "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 - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "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, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - } - }, - "engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", - "dev": true, - "optional": true, - "requires": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "dev": true, - "optional": true - }, - "esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", - "dev": true - }, - "esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@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" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "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, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "requires": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "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, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", - "dev": true - }, - "injection-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "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 - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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 - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "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==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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 - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "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 - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "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==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "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 - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "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 - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", - "dev": true, - "requires": { - "which": "^1.2.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "karma-coverage": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", - "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "requires": { - "jasmine-core": "^4.1.0" - } - }, - "karma-jasmine-html-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", - "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", - "dev": true, - "requires": {} - }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, - "less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", - "dev": true, - "requires": { - "copy-anything": "^2.0.1", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^2.3.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "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, - "optional": true - } - } - }, - "less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", - "dev": true, - "requires": { - "klona": "^2.0.4" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "requires": { - "webpack-sources": "^3.0.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "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, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "log4js": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.7.1.tgz", - "integrity": "sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ==", - "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.3" - } - }, - "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "dev": true - }, - "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "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 - }, - "memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "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 - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "ng-packagr": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-14.2.2.tgz", - "integrity": "sha512-AqwHcMM6x+JkCHT++IsbulnTdyoXcC2Cr4tbPamuieacc77+fFbB195hdcqEFwsKX5410cymx/ZUyHird9rxlg==", - "dev": true, - "requires": { - "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^13.1.3", - "ajv": "^8.10.0", - "ansi-colors": "^4.1.1", - "browserslist": "^4.20.0", - "cacache": "^16.0.0", - "chokidar": "^3.5.3", - "commander": "^9.0.0", - "dependency-graph": "^0.11.0", - "esbuild": "^0.15.0", - "esbuild-wasm": "^0.15.0", - "find-cache-dir": "^3.3.2", - "glob": "^8.0.0", - "injection-js": "^2.4.0", - "jsonc-parser": "^3.0.0", - "less": "^4.1.2", - "ora": "^5.1.0", - "postcss": "^8.4.8", - "postcss-preset-env": "^7.4.2", - "postcss-url": "^10.1.3", - "rollup": "^2.70.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rxjs": "^7.5.5", - "sass": "^1.49.9", - "stylus": "^0.59.0" - } - }, - "nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "optional": true, - "requires": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "optional": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - }, - "npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", - "dev": true, - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^2.0.0" - } - }, - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "dev": true - } - } - }, - "npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", - "dev": true, - "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - } - }, - "npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", - "dev": true, - "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "dependencies": { - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", - "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "optional": true - }, - "parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", - "dev": true, - "requires": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, - "parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", - "dev": true, - "requires": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0", - "nice-napi": "^1.0.2" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dev": true, - "requires": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-url": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", - "dev": true, - "requires": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", - "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", - "dev": true - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, - "proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", - "dev": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "dev": true - } - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "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 - } - } - }, - "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, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-sourcemaps": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", - "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.9", - "source-map-resolve": "^0.6.0" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", - "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "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 - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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 - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socket.io": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", - "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.1", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.1" - } - }, - "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "dependencies": { - "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, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, - "streamroller": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", - "integrity": "sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w==", - "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "dev": true, - "requires": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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 - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, + ], + "license": "MIT", + "peer": true, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "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, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" - }, - "ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "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 - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "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 - }, - "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 - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "node_modules/vite/node_modules/rollup": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", + "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", "dev": true, - "requires": { - "builtins": "^5.0.0" + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.0", + "@rollup/rollup-android-arm64": "4.40.0", + "@rollup/rollup-darwin-arm64": "4.40.0", + "@rollup/rollup-darwin-x64": "4.40.0", + "@rollup/rollup-freebsd-arm64": "4.40.0", + "@rollup/rollup-freebsd-x64": "4.40.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", + "@rollup/rollup-linux-arm-musleabihf": "4.40.0", + "@rollup/rollup-linux-arm64-gnu": "4.40.0", + "@rollup/rollup-linux-arm64-musl": "4.40.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-musl": "4.40.0", + "@rollup/rollup-linux-s390x-gnu": "4.40.0", + "@rollup/rollup-linux-x64-gnu": "4.40.0", + "@rollup/rollup-linux-x64-musl": "4.40.0", + "@rollup/rollup-win32-arm64-msvc": "4.40.0", + "@rollup/rollup-win32-ia32-msvc": "4.40.0", + "@rollup/rollup-win32-x64-msvc": "4.40.0", + "fsevents": "~2.3.2" } }, - "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 - }, - "void-elements": { + "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "wbuf": { + "node_modules/wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "minimalistic-assert": "^1.0.0" } }, - "wcwidth": { + "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "defaults": "^1.0.3" } }, - "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/webpack": { + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@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.10.0", - "es-module-lexer": "^0.9.0", + "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.9", + "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": "^3.1.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "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 - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true } } }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, - "dependencies": { - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true } } }, - "webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "node_modules/webpack-dev-server": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", + "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "http-proxy-middleware": "^2.0.7", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "utf-8-validate": { + "optional": true } } }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" } }, - "webpack-sources": { + "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } }, - "webpack-subresource-integrity": { + "node_modules/webpack-subresource-integrity": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/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.0.0" + } + }, + "node_modules/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": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "websocket-driver": { + "node_modules/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" + }, + "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "requires": { + "license": "Apache-2.0", + "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "websocket-extensions": { + "node_modules/websocket-extensions": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } + "license": "MIT" }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "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" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, - "requires": {} + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "requires": { - "cuint": "^0.2.2" + "license": "MIT", + "engines": { + "node": ">=0.4" } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "requires": { - "cliui": "^7.0.2", + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "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", + "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.0.0" + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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/yargs/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", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", - "requires": { - "tslib": "^2.3.0" + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zone.js": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", + "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", + "license": "MIT" } } } diff --git a/package.json b/package.json index 3272bd50..2670749b 100644 --- a/package.json +++ b/package.json @@ -1,84 +1,86 @@ { "name": "coreui-angular-dev", - "version": "4.2.18", + "version": "5.4.9", "description": "CoreUI Components Library for Angular", + "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT", "author": "The CoreUI Team (https://github.com/orgs/coreui/people)", "scripts": { "lib": "ng", - "watch:lib:dev": "ng build coreui-angular --watch --configuration development", + "watch:lib:dev": "ng build coreui-angular --watch --configuration production", "build:lib:prod": "ng build coreui-angular", + "postbuild:lib:prod": "npm run build --prefix projects/coreui-angular", "test:lib:dev": "ng test coreui-angular", + "test:lib:cov": "ng test --watch --code-coverage coreui-angular ", "test:lib:prod": "ng test coreui-angular --karma-config=projects/coreui-angular/karma.conf.github.js", - "prepublish:lib": "ng build coreui-icons-angular && ng lint coreui-angular && ng test coreui-angular --watch=false && ng build coreui-angular", + "prepublish:lib": "npm run prepublish:icons && ng lint coreui-angular && ng test coreui-angular --watch=false && npm run build:lib:prod", "publish:lib": "cd dist/coreui-angular/ && npm publish --tag next --dry-run", "lint:lib": "ng lint coreui-angular", "link:lib": "cd dist/coreui-angular/ && npm link", "chartjs": "ng", "watch:chartjs:dev": "ng build coreui-angular-chartjs --watch --configuration development", "build:chartjs:prod": "ng build coreui-angular-chartjs", + "postbuild:chartjs:prod": "npm run build --prefix projects/coreui-angular-chartjs", "test:chartjs:dev": "ng test coreui-angular-chartjs", "test:chartjs:prod": "ng test coreui-angular-chartjs --karma-config=projects/coreui-angular-chartjs/karma.conf.github.js", - "prepublish:chartjs": "ng lint coreui-angular-chartjs && ng test coreui-angular-chartjs --watch=false && ng build coreui-angular-chartjs", + "prepublish:chartjs": "ng lint coreui-angular-chartjs && ng test coreui-angular-chartjs --watch=false && npm run build:chartjs:prod", "publish:chartjs": "cd dist/coreui-angular-chartjs/ && npm publish --tag next --dry-run", "lint:chartjs": "ng lint coreui-angular-chartjs", "link:chartjs": "cd dist/coreui-angular-chartjs/ && npm link", "icons": "ng", - "watch:icons:dev": "ng build coreui-icons-angular --watch --configuration development", + "watch:icons:dev": "ng build coreui-icons-angular --watch --configuration production", "build:icons:prod": "ng build coreui-icons-angular", + "postbuild:icons:prod": "npm run build --prefix projects/coreui-icons-angular", "test:icons:dev": "ng test coreui-icons-angular", "test:icons:prod": "ng test coreui-icons-angular --karma-config=projects/coreui-icons-angular/karma.conf.github.js", - "prepublish:icons": "ng lint coreui-icons-angular && ng test coreui-icons-angular --watch=false && ng build coreui-icons-angular", + "prepublish:icons": "ng lint coreui-icons-angular && ng test coreui-icons-angular --watch=false && npm run build:icons:prod", "publish:icons": "cd dist/coreui-icons-angular/ && npm publish --tag next --dry-run", "lint:icons": "ng lint coreui-icons-angular", "link:icons": "cd dist/coreui-icons-angular/ && npm link" }, "private": true, "dependencies": { - "@angular/animations": "^14.2.12", - "@angular/cdk": "^14.2.7", - "@angular/common": "^14.2.12", - "@angular/compiler": "^14.2.12", - "@angular/core": "^14.2.12", - "@angular/forms": "^14.2.12", - "@angular/localize": "^14.2.12", - "@angular/platform-browser": "^14.2.12", - "@angular/platform-browser-dynamic": "^14.2.12", - "@angular/router": "^14.2.12", - "@coreui/chartjs": "^3.0.0", - "@popperjs/core": "~2.11.6", - "chart.js": "^3.9.1", + "@angular/animations": "^19.2.7", + "@angular/cdk": "^19.2.10", + "@angular/common": "^19.2.7", + "@angular/compiler": "^19.2.7", + "@angular/core": "^19.2.7", + "@angular/forms": "^19.2.7", + "@angular/localize": "^19.2.7", + "@angular/platform-browser": "^19.2.7", + "@angular/platform-browser-dynamic": "^19.2.7", + "@angular/router": "^19.2.7", + "@coreui/chartjs": "~4.1.0", + "@coreui/icons": "^3.0.1", + "@popperjs/core": "~2.11.8", + "chart.js": "^4.4.9", "lodash-es": "^4.17.21", - "rxjs": "~7.5.0", - "tslib": "^2.4.1", - "zone.js": "~0.11.8" + "rxjs": "~7.8.2", + "tslib": "^2.8.1", + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^14.2.10", - "@angular-eslint/builder": "^14.4.0", - "@angular-eslint/eslint-plugin": "^14.4.0", - "@angular-eslint/eslint-plugin-template": "^14.4.0", - "@angular-eslint/schematics": "^14.4.0", - "@angular-eslint/template-parser": "^14.4.0", - "@angular/cli": "^14.2.10", - "@angular/compiler-cli": "^14.2.12", - "@angular/language-service": "^14.2.12", - "@coreui/icons": "^2.1.0", - "@types/jasmine": "~4.3.0", - "@types/lodash-es": "^4.17.6", - "@types/node": "^16.18.4", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", - "eslint": "~8.29.0", - "jasmine-core": "^4.5.0", - "karma": "^6.4.1", - "karma-chrome-launcher": "^3.1.1", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "^2.0.0", - "ng-packagr": "^14.2.2", - "prettier": "^2.7.1", - "typescript": "~4.7.4" + "@angular-devkit/build-angular": "^19.2.8", + "@angular-devkit/schematics": "^19.2.8", + "@angular/cli": "^19.2.8", + "@angular/compiler-cli": "^19.2.7", + "@angular/language-service": "^19.2.7", + "@types/jasmine": "^5.1.7", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.14.1", + "angular-eslint": "^19.3.0", + "copyfiles": "^2.4.1", + "eslint": "^9.24.0", + "jasmine-core": "^5.6.0", + "karma": "^6.4.4", + "karma-chrome-launcher": "^3.2.0", + "karma-coverage": "^2.2.1", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.1.0", + "ng-packagr": "^19.2.2", + "prettier": "^3.5.3", + "typescript": "~5.7.3", + "typescript-eslint": "^8.30.1" }, "keywords": [ "angular", @@ -101,10 +103,10 @@ "url": "git+https://github.com/coreui/coreui-angular.git" }, "config": { - "version_short": "4.2" + "version_short": "5.4" }, "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": ">=6" + "node": "^20.11.1 || ^22.0.0", + "npm": ">=9" } } diff --git a/projects/coreui-angular-chartjs/.browserslistrc b/projects/coreui-angular-chartjs/.browserslistrc deleted file mode 100644 index 4f9ac269..00000000 --- a/projects/coreui-angular-chartjs/.browserslistrc +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR diff --git a/projects/coreui-angular-chartjs/.eslintrc.json b/projects/coreui-angular-chartjs/.eslintrc.json deleted file mode 100644 index 356cf98b..00000000 --- a/projects/coreui-angular-chartjs/.eslintrc.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "!**/*" - ], - "overrides": [ - { - "files": [ - "*.ts" - ], - "parserOptions": { - "project": [ - "./tsconfig.json" - ], - "createDefaultProgram": true - }, - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "c", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "error", - { - "type": "element", - "prefix": "c", - "style": "kebab-case" - } - ] - } - }, - { - "files": [ - "*.html" - ], - "rules": {} - } - ] -} diff --git a/projects/coreui-angular-chartjs/LICENSE b/projects/coreui-angular-chartjs/LICENSE index 1f38323c..fbb053e0 100644 --- a/projects/coreui-angular-chartjs/LICENSE +++ b/projects/coreui-angular-chartjs/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 creativeLabs Łukasz Holeczek +Copyright (c) 2025 creativeLabs Łukasz Holeczek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/projects/coreui-angular-chartjs/README.md b/projects/coreui-angular-chartjs/README.md index c393e8bb..589ce0b7 100644 --- a/projects/coreui-angular-chartjs/README.md +++ b/projects/coreui-angular-chartjs/README.md @@ -1,5 +1,5 @@

- + CoreUI logo

-

CoreUI Angular wrapper for Chart.js

+

CoreUI Angular wrapper for Chart.js v4

- Explore @coreui/angular-chartjs docs & examples » + Explore @coreui/angular-chartjs docs & examples »

- Report bug + Report bug · - Request feature + Request feature · Blog

+
+

+Featured CoreUI for Angular libraries: +
CoreUI Components for Angular +
CoreUI Angular wrapper for Chart.js v4 +
CoreUI Icons for Angular +

+
-## Status +### Status ![angular][angular-badge] -[![npm package][npm-badge]][npm] +[![npm package][npm-badge-v5-ng19]][npm] +[![npm package][npm-badge-latest]][npm] [![npm package][npm-badge-next]][npm] -[![NPM downloads][npm-download]][npm] - +[![NPM downloads][npm-download]][npm] +[![Project chartjs check](https://github.com/coreui/coreui-angular/actions/workflows/project-chartjs-check.yml/badge.svg)](https://github.com/coreui/coreui-angular/actions/workflows/project-chartjs-check.yml) -[npm-badge]: https://img.shields.io/npm/v/@coreui/angular-chartjs/latest?style=flat-square&color=brightgreen +[npm-badge-v5-ng19]: https://img.shields.io/npm/v/@coreui/angular-chartjs/v5-ng19?style=flat-square&color=brightgreen +[npm-badge-latest]: https://img.shields.io/npm/v/@coreui/angular-chartjs/latest?style=flat-square&color=brightgreen [npm-badge-next]: https://img.shields.io/npm/v/@coreui/angular-chartjs/next?style=flat-square&color=red [npm]: https://www.npmjs.com/package/@coreui/angular-chartjs [npm-download]: https://img.shields.io/npm/dm/@coreui/angular-chartjs.svg?style=flat-square -[angular-badge]: https://img.shields.io/badge/angular-^14.0.0-lightgrey.svg?style=flat-square&logo=angular +[angular-badge]: https://img.shields.io/badge/angular-^19.2.0-lightgrey.svg?style=flat-square&logo=angular ##### install: +- Angular CLI: +```bash +ng add @coreui/angular-chartjs +```` + +- or npm ```bash -npm install chart.js -npm install @coreui/chartjs@3 -npm install @coreui/angular-chartjs +npm install chart.js@4 +npm install @coreui/chartjs@~4.1 +npm install @coreui/angular-chartjs@~5.4 ```` ##### import: ```ts +// ng modules import { ChartjsModule } from '@coreui/angular-chartjs'; @NgModule({ - imports: [ - ChartjsModule, + imports: [ + ChartjsModule, +... +``` +```ts +// standalone components + import { ChartjsComponent } from '@coreui/angular-chartjs'; + +@Component({ + imports: [ + ChartjsComponent, ... ``` @@ -171,4 +200,4 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2022 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2025 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/projects/coreui-angular-chartjs/eslint.config.js b/projects/coreui-angular-chartjs/eslint.config.js new file mode 100644 index 00000000..1470027e --- /dev/null +++ b/projects/coreui-angular-chartjs/eslint.config.js @@ -0,0 +1,15 @@ +// @ts-check +const tseslint = require('typescript-eslint'); +const rootConfig = require('../../eslint.config.js'); + +module.exports = tseslint.config( + ...rootConfig, + { + files: ['**/*.ts'], + rules: {} + }, + { + files: ['**/*.html'], + rules: {} + } +); diff --git a/projects/coreui-angular-chartjs/karma.conf.js b/projects/coreui-angular-chartjs/karma.conf.js index ac0133e6..16edb4cf 100644 --- a/projects/coreui-angular-chartjs/karma.conf.js +++ b/projects/coreui-angular-chartjs/karma.conf.js @@ -27,17 +27,20 @@ module.exports = function (config) { coverageReporter: { dir: require('path').join(__dirname, '../../coverage/coreui-angular-chartjs'), subdir: '.', - reporters: [ - { type: 'html' }, - { type: 'text-summary' } - ] + reporters: [{ type: 'html' }, { type: 'text-summary' }] }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['Chrome'], + browsers: ['Chrome_Custom'], + customLaunchers: { + Chrome_Custom: { + base: 'Chrome', + flags: ['--disable-search-engine-choice-screen'] + } + }, singleRun: false, restartOnFileChange: true }); diff --git a/projects/coreui-angular-chartjs/package.json b/projects/coreui-angular-chartjs/package.json index 61f2189f..ef58542a 100644 --- a/projects/coreui-angular-chartjs/package.json +++ b/projects/coreui-angular-chartjs/package.json @@ -1,8 +1,8 @@ { "name": "@coreui/angular-chartjs", - "version": "4.2.15", + "version": "5.4.9", "description": "Angular wrapper component for Chart.js", - "copyright": "Copyright 2022 creativeLabs Łukasz Holeczek", + "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT", "homepage": "https://coreui.io/angular", "author": { @@ -25,16 +25,15 @@ "url": "https://github.com/coreui/coreui-angular/issues" }, "peerDependencies": { - "@angular/cdk": "^14.0.0", - "@angular/common": "^14.0.0", - "@angular/core": "^14.0.0", - "@coreui/chartjs": "^3.0.0", - "chart.js": "^3.7.1" + "@angular/core": "^19.2.0", + "@coreui/chartjs": "~4.0.0 || ~4.1.0", + "chart.js": "^4.4.9" }, "dependencies": { "lodash-es": "^4.17.21", "tslib": "^2.3.0" }, + "sideEffects": false, "keywords": [ "coreui", "coreui-chartjs", @@ -42,5 +41,17 @@ "component", "chartjs", "angular" - ] + ], + "devDependencies": { + "copyfiles": "file:../../node_modules/copyfiles", + "typescript": "file:../../node_modules/typescript" + }, + "schematics": "./schematics/collection.json", + "scripts": { + "build": "tsc -p tsconfig.schematics.json", + "postbuild": "copyfiles schematics/*/files/** schematics/collection.json ../../dist/coreui-angular-chartjs/" + }, + "ng-add": { + "save": true + } } diff --git a/projects/coreui-angular-chartjs/schematics/collection.json b/projects/coreui-angular-chartjs/schematics/collection.json new file mode 100644 index 00000000..7f426a32 --- /dev/null +++ b/projects/coreui-angular-chartjs/schematics/collection.json @@ -0,0 +1,9 @@ +{ + "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", + "schematics": { + "ng-add": { + "description": "Add @coreui/angular-chartjs library to the project.", + "factory": "./ng-add/index#ngAdd" + } + } +} diff --git a/projects/coreui-angular-chartjs/schematics/ng-add/index.ts b/projects/coreui-angular-chartjs/schematics/ng-add/index.ts new file mode 100644 index 00000000..e2d9677e --- /dev/null +++ b/projects/coreui-angular-chartjs/schematics/ng-add/index.ts @@ -0,0 +1,59 @@ +import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics'; +import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; +import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies'; +import { getPackageVersionFromPackageJson, PackageJson } from './package-config'; +import * as pkgJson from '../../package.json'; + +export function ngAdd(): Rule { + return (tree: Tree, context: SchematicContext) => { + const pkg = pkgJson as unknown as PackageJson; + + context.logger.info(``); + context.logger.info(`Installing ${pkg.name} dependencies...`); + + const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core'); + context.logger.info(`@angular/core version ${ngCoreVersionTag}`); + if (!ngCoreVersionTag) { + throw new SchematicsException('@angular/core version not found'); + } + + const libraryDeps: NodeDependency[] = [ + { + name: '@coreui/chartjs', + type: NodeDependencyType.Default, + version: pkg.peerDependencies['@coreui/chartjs'], + overwrite: true + }, + { + name: 'chart.js', + type: NodeDependencyType.Default, + version: pkg.peerDependencies['chart.js'], + overwrite: true + }, + { + name: 'lodash-es', + type: NodeDependencyType.Default, + version: pkg.dependencies['lodash-es'], + overwrite: true + } + ]; + + libraryDeps.forEach((dep) => { + addPackageJsonDependency(tree, dep); + context.logger.info(`Added dependency: ${dep.name}@${dep.version}`); + }); + + const library: NodeDependency = { + name: pkg.name, + type: NodeDependencyType.Default, + version: `~${pkg.version}`, + overwrite: true + }; + + addPackageJsonDependency(tree, library); + context.logger.info(`Installing ${library.name}@${library.version}`); + context.addTask(new NodePackageInstallTask()); + + return tree; + }; +} diff --git a/projects/coreui-angular-chartjs/schematics/ng-add/package-config.ts b/projects/coreui-angular-chartjs/schematics/ng-add/package-config.ts new file mode 100644 index 00000000..95c3c1d1 --- /dev/null +++ b/projects/coreui-angular-chartjs/schematics/ng-add/package-config.ts @@ -0,0 +1,68 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import { Tree } from '@angular-devkit/schematics'; + +export interface PackageJson { + dependencies: Record; + name: string; + peerDependencies: Record; + version: string; +} + +/** + * Sorts the keys of the given object. + * @returns A new object instance with sorted keys + */ +function sortObjectByKeys(obj: Record) { + return Object.keys(obj) + .sort() + .reduce( + (result, key) => { + result[key] = obj[key]; + return result; + }, + {} as Record + ); +} + +/** Adds a package to the package.json in the given host tree. */ +export function addPackageToPackageJson(host: Tree, pkg: string, version: string): Tree { + if (host.exists('package.json')) { + const sourceText = host.read('package.json')!.toString('utf-8'); + const json = JSON.parse(sourceText) as PackageJson; + + if (!json.dependencies) { + json.dependencies = {}; + } + + if (!json.dependencies[pkg]) { + json.dependencies[pkg] = version; + json.dependencies = sortObjectByKeys(json.dependencies); + } + + host.overwrite('package.json', JSON.stringify(json, null, 2)); + } + + return host; +} + +/** Gets the version of the specified package by looking at the package.json in the given tree. */ +export function getPackageVersionFromPackageJson(tree: Tree, name: string): string | null { + if (!tree.exists('package.json')) { + return null; + } + + const packageJson = JSON.parse(tree.read('package.json')!.toString('utf8')) as PackageJson; + + if (packageJson.dependencies && packageJson.dependencies[name]) { + return packageJson.dependencies[name]; + } + + return null; +} diff --git a/projects/coreui-angular-chartjs/src/index.ts b/projects/coreui-angular-chartjs/src/index.ts new file mode 100644 index 00000000..7e1a213e --- /dev/null +++ b/projects/coreui-angular-chartjs/src/index.ts @@ -0,0 +1 @@ +export * from './public-api'; diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.component.html b/projects/coreui-angular-chartjs/src/lib/chartjs.component.html index bea995c7..bbc4f12f 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.component.html +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.component.html @@ -1,11 +1,12 @@ - + + diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.component.scss b/projects/coreui-angular-chartjs/src/lib/chartjs.component.scss index 19dd169a..e0c8b1e2 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.component.scss +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.component.scss @@ -1,6 +1,5 @@ :host { &.chart-wrapper { display: block; - //height: 100%; } } diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts b/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts index 27f29cee..9bc21f02 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts @@ -1,10 +1,12 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; import { ChartjsComponent } from './chartjs.component'; import { Chart, registerables } from 'chart.js'; +import { ComponentRef } from '@angular/core'; describe('ChartjsComponent', () => { let component: ChartjsComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; const colors = { @@ -18,50 +20,53 @@ describe('ChartjsComponent', () => { const data = { labels: labels, - datasets: [{ - data: [65, 59, 84, 84, 51, 55, 40], - ...colors, - fill: { value: 65 } - }] + datasets: [ + { + data: [65, 59, 84, 84, 51, 55, 40], + ...colors, + fill: { value: 65 } + } + ] }; beforeEach(async () => { Chart.register(...registerables); await TestBed.configureTestingModule({ - declarations: [ChartjsComponent] - }) - .compileComponents(); + imports: [ChartjsComponent] + }).compileComponents(); }); beforeEach(() => { - // @ts-ignore fixture = TestBed.createComponent(ChartjsComponent); component = fixture.componentInstance; - component.data = undefined; - component.type = 'line'; + componentRef = fixture.componentRef; + componentRef.setInput('type', 'line'); + componentRef.setInput('wrapper', true); + componentRef.setInput('data', undefined); + fixture.detectChanges(); }); it('chart should create', fakeAsync(() => { - fixture.detectChanges(); - tick(); expect(component).toBeTruthy(); expect(component.chart).toBeDefined(); })); it('chart should receive data', fakeAsync(() => { - component.data = { ...data }; + componentRef.setInput('data', { ...data }); fixture.detectChanges(); - tick(); + // tick(); expect(component.chart?.config.data.labels?.length).toBe(7); expect(component.chart?.config.data.labels).toEqual(labels); expect(component.chart?.config.data.datasets[0]?.data.length).toBe(7); })); it('chart to Base64Image', fakeAsync(() => { - component.data = { ...data }; + componentRef.setInput('height', 100); + componentRef.setInput('width', 100); + componentRef.setInput('data', { ...data }); fixture.detectChanges(); - tick(); + // tick(); const image = component.chartToBase64Image(); expect(image).toBeDefined(); expect(typeof image).toBe('string'); @@ -69,17 +74,32 @@ describe('ChartjsComponent', () => { })); it('chart should update on data change', fakeAsync(() => { - component.data = { + componentRef.setInput('data', { ...data }); + fixture.detectChanges(); + // tick(); + expect(component.chart?.config.data.labels?.length).toBe(7); + expect(component.chart?.config.data.labels).toEqual(labels); + expect(component.chart?.config.data.datasets[0]?.data.length).toBe(7); + + const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May']; + componentRef.setInput('data', { ...data, - labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'], + labels: [...months], datasets: [ { ...data.datasets[0], data: [42, 88, 42, 66, 77] }, - { ...data.datasets[0], data: [55, 44, 55, 66, 22] } + { ...data.datasets[1], data: [55, 44, 55, 66, 22] } ] - }; + }); fixture.detectChanges(); - tick(); + // component.chartUpdate(); + // tick(); expect(component.chart?.config?.data.labels?.length).toBe(5); + expect(component.chart?.config.data.labels).toEqual(months); expect(component.chart?.config?.data.datasets[1]?.data.length).toBe(5); })); + + it('should have css classes', () => { + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('chart-wrapper'); + }); }); diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts b/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts index b084b821..eaf2680b 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts @@ -1,26 +1,33 @@ import { - AfterViewInit, + afterRenderEffect, + booleanAttribute, + ChangeDetectionStrategy, + ChangeDetectorRef, Component, + computed, ElementRef, - EventEmitter, - HostBinding, - Input, + inject, + input, + linkedSignal, NgZone, + numberAttribute, OnChanges, OnDestroy, - Output, + output, Renderer2, SimpleChanges, - ViewChild + untracked, + viewChild } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty, coerceNumberProperty, NumberInput } from '@angular/cdk/coercion'; import merge from 'lodash-es/merge'; -import { Chart, ChartConfiguration, ChartOptions, ChartType, DefaultDataPoint, registerables } from 'chart.js'; +import type { ChartConfiguration, ChartData, ChartOptions, ChartType, InteractionItem, Plugin } from 'chart.js'; +import { Chart as ChartJS, registerables } from 'chart.js'; import { customTooltips as cuiCustomTooltips } from '@coreui/chartjs'; +import { BooleanInput } from './chartjs.interface'; -Chart.register(...registerables); +ChartJS.register(...registerables); let nextId = 0; @@ -28,84 +35,119 @@ let nextId = 0; selector: 'c-chart', templateUrl: './chartjs.component.html', styleUrls: ['./chartjs.component.scss'], - exportAs: 'cChart' + exportAs: 'cChart', + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '[class]': 'hostClasses()', + '[style.height.px]': 'height()', + '[style.width.px]': 'width()' + } }) -export class ChartjsComponent, TLabel = unknown> implements AfterViewInit, OnDestroy, OnChanges { - - static ngAcceptInputType_height: NumberInput; - static ngAcceptInputType_width: NumberInput; +export class ChartjsComponent implements OnDestroy, OnChanges { + // static ngAcceptInputType_redraw: BooleanInput; - @Input() customTooltips = true; - @Input() data?: ChartConfiguration['data']; - - @HostBinding('style.height.px') - @Input() - set height(value: number | undefined) { - this._height = coerceNumberProperty(value); + private readonly ngZone = inject(NgZone); + private readonly renderer = inject(Renderer2); + private readonly changeDetectorRef = inject(ChangeDetectorRef); + + /** + * Enables custom html based tooltips instead of standard tooltips. + * @return boolean + * @default true + */ + readonly customTooltips = input(true, { transform: booleanAttribute }); + + /** + * The data object that is passed into the Chart.js chart (more info). + */ + readonly data = input(); + + /** + * A fallback when the canvas cannot be rendered. Can be used for accessible chart descriptions. + */ + // @Input() fallbackContent?: TemplateRef; + + /** + * Height attribute applied to the rendered canvas. + * @return number | undefined + * @default null + */ + readonly height = input(null, { transform: (value) => numberAttribute(value, undefined) }); + + /** + * ID attribute applied to the rendered canvas. + * @return string + */ + readonly idInput = input(`c-chartjs-${nextId++}`, { alias: 'id' }); + + get id() { + return this.idInput(); } - get height() { - return this._height; - } + /** + * The options object that is passed into the Chart.js chart. + */ + readonly optionsInput = input({}, { alias: 'options' }); - private _height: number | undefined; + readonly options = linkedSignal(this.optionsInput); - @Input() id = `c-chartjs-${nextId++}`; - @Input() options?: ChartConfiguration['options']; - @Input() plugins: ChartConfiguration['plugins'] = []; + /** + * The plugins array that is passed into the Chart.js chart + */ + readonly plugins = input([]); - @Input() - set redraw(value: boolean) { - this._redraw = coerceBooleanProperty(value); - } + /** + * If true, will tear down and redraw chart on all updates. + * @return boolean + * @default false + */ + readonly redraw = input(false, { transform: booleanAttribute }); - get redraw(): boolean { - return this._redraw; - } + /** + * Chart.js chart type. + * @return {'line' | 'bar' | 'radar' | 'doughnut' | 'polarArea' | 'bubble' | 'pie' | 'scatter'} + */ + readonly type = input('bar'); - private _redraw = false; + /** + * Width attribute applied to the rendered canvas. + * @return number | undefined + * @default null + */ + readonly width = input(null, { transform: (value) => numberAttribute(value, undefined) }); - @Input() type: ChartConfiguration['type'] = 'bar' as TType; + /** + * Put the chart into the wrapper div element. + * @default true + */ + readonly wrapper = input(true, { transform: booleanAttribute }); - @HostBinding('style.width.px') - @Input() - set width(value: number | undefined) { - this._width = coerceNumberProperty(value); - } + readonly getDatasetAtEvent = output(); + readonly getElementAtEvent = output(); + readonly getElementsAtEvent = output(); - get width() { - return this._width; - } + readonly chartRef = output(); - private _width: number | undefined; + readonly canvasElement = viewChild.required('canvasElement'); - @Input() wrapper = true; + chart!: ChartJS; + ctx!: CanvasRenderingContext2D; - @Output() getDatasetAtEvent = new EventEmitter(); - @Output() getElementAtEvent = new EventEmitter(); - @Output() getElementsAtEvent = new EventEmitter(); - - @ViewChild('canvasElement') canvasElement!: ElementRef; - - chart!: Chart; - - @HostBinding('class') - get hostClasses() { + readonly hostClasses = computed(() => { return { - 'chart-wrapper': this.wrapper + 'chart-wrapper': this.wrapper() }; - } + }); - constructor( - private elementRef: ElementRef, - private ngZone: NgZone, - private renderer: Renderer2 - ) {} - - ngAfterViewInit(): void { - this.chartRender(); - // this.chartUpdate(); + constructor() { + afterRenderEffect({ + read: () => { + const canvasElement = this.canvasElement(); + this.ctx = canvasElement?.nativeElement?.getContext('2d'); + this.chartRender(); + } + }); } ngOnChanges(changes: SimpleChanges): void { @@ -118,56 +160,75 @@ export class ChartjsComponent { const config = this.chartConfig(); if (config) { - setTimeout(() => { - this.chart = new Chart(ctx, config); - this.renderer.setStyle(this.canvasElement.nativeElement, 'display', 'block'); + this.chart = new ChartJS(this.ctx, config); + this.ngZone.run(() => { + this.renderer.setStyle(canvasElement.nativeElement, 'display', 'block'); + this.changeDetectorRef.markForCheck(); + this.chartRef.emit(this.chart); }); } }); } chartUpdate() { - if (!this.chart) return; + if (!this.chart) { + return; + } - if (this.redraw) { + if (this.redraw()) { this.chartDestroy(); - setTimeout(() => { - this.chartRender(); - }); + this.chartRender(); return; } - const config = this.chartConfig(); + const config: ChartConfiguration = this.chartConfig(); - if (this.options) { - // todo - // @ts-ignore - Object.assign(this.chart.options, config.options); + if (this.options()) { + Object.assign(this.chart.options ?? {}, config.options ?? {}); } if (!this.chart.config.data) { @@ -176,12 +237,8 @@ export class ChartjsComponent { this.ngZone.runOutsideAngular(() => { this.chart?.update(); + this.ngZone.run(() => { + this.changeDetectorRef.markForCheck(); + }); }); }); } @@ -200,47 +260,48 @@ export class ChartjsComponent['data'] { + private chartDataConfig = computed(() => { + const { labels, datasets } = { ...this.data() }; return { - labels: this.data?.labels ?? [], - datasets: this.data?.datasets ?? [] + labels: labels ?? [], + datasets: datasets ?? [] }; - } + }); - private chartOptions(): ChartConfiguration['options'] { - return this.options; - } + readonly chartOptions = computed(() => this.options() ?? {}); - private chartConfig(): ChartConfiguration { + readonly chartConfig = computed(() => { this.chartCustomTooltips(); return { data: this.chartDataConfig(), options: this.chartOptions(), - plugins: this.plugins, - type: this.type + plugins: this.plugins(), + type: this.type() }; - } + }); private chartCustomTooltips() { - if (this.customTooltips) { - const options = this.options; - // @ts-ignore - const plugins = this.options?.plugins; - // @ts-ignore - const tooltip = this.options?.plugins?.tooltip; - this.options = merge({ - ...options, - plugins: { - ...plugins, - tooltip: { - ...tooltip, - enabled: false, - mode: 'index', - position: 'nearest', - external: cuiCustomTooltips - } - } + if (this.customTooltips()) { + const options = this.options(); + const plugins = options?.plugins; + const tooltip = options?.plugins?.tooltip; + untracked(() => { + this.options.set( + merge({ + ...options, + plugins: { + ...plugins, + tooltip: { + ...tooltip, + enabled: false, + mode: 'index', + position: 'nearest', + external: cuiCustomTooltips + } + } + }) + ); }); } - }; + } } diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.interface.ts b/projects/coreui-angular-chartjs/src/lib/chartjs.interface.ts index 4d883657..6c35ea4a 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.interface.ts +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.interface.ts @@ -2,6 +2,8 @@ import { ChartType } from 'chart.js/auto'; import { EventEmitter } from '@angular/core'; import { ChartConfiguration, DefaultDataPoint } from 'chart.js'; +export declare type BooleanInput = string | boolean | null | undefined; + export interface IChartjs, TLabel = unknown> { /** * Enables custom html based tooltips instead of standard tooltips. @@ -77,4 +79,8 @@ export interface IChartjs; + /** + * Emits the chart reference + */ + chartRef: EventEmitter; } diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.module.ts b/projects/coreui-angular-chartjs/src/lib/chartjs.module.ts index 518354ff..dc236d13 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.module.ts +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.module.ts @@ -2,11 +2,11 @@ import { NgModule } from '@angular/core'; import { ChartjsComponent } from './chartjs.component'; @NgModule({ - declarations: [ + imports: [ ChartjsComponent ], exports: [ ChartjsComponent ] }) -export class ChartjsModule { } +export class ChartjsModule {} diff --git a/projects/coreui-angular-chartjs/src/test.ts b/projects/coreui-angular-chartjs/src/test.ts index 1c114a05..f17fa2d1 100644 --- a/projects/coreui-angular-chartjs/src/test.ts +++ b/projects/coreui-angular-chartjs/src/test.ts @@ -8,21 +8,9 @@ import { platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; -declare const require: { - context(path: string, deep?: boolean, filter?: RegExp): { - (id: string): T; - keys(): string[]; - }; -}; - // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { teardown: { destroyAfterEach: true }}, ); - -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); diff --git a/projects/coreui-angular-chartjs/tsconfig.schematics.json b/projects/coreui-angular-chartjs/tsconfig.schematics.json new file mode 100644 index 00000000..acbc130f --- /dev/null +++ b/projects/coreui-angular-chartjs/tsconfig.schematics.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "lib": [ + "ES2022", + "dom" + ], + "declaration": true, + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "rootDir": "schematics", + "outDir": "../../dist/coreui-angular-chartjs/schematics", + "resolveJsonModule": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strictNullChecks": true, + "target": "ES2022", + "types": [ + "jasmine", + "node" + ] + }, + "include": [ + "schematics/**/*" + ], + "exclude": [ + "schematics/*/files/**/*" + ] +} diff --git a/projects/coreui-angular/.browserslistrc b/projects/coreui-angular/.browserslistrc deleted file mode 100644 index 4f9ac269..00000000 --- a/projects/coreui-angular/.browserslistrc +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR diff --git a/projects/coreui-angular/.eslintrc.json b/projects/coreui-angular/.eslintrc.json deleted file mode 100644 index e7686e15..00000000 --- a/projects/coreui-angular/.eslintrc.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "!**/*" - ], - "overrides": [ - { - "files": [ - "*.ts" - ], - "parserOptions": { - "project": [ - "./tsconfig.json" - ], - "createDefaultProgram": true - }, - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "c", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "warn", - { - "type": "element", - "prefix": "c", - "style": "kebab-case" - } - ], - "@angular-eslint/no-input-rename": [ - "warn" - ] - } - }, - { - "files": [ - "*.html" - ], - "rules": {} - } - ] -} diff --git a/projects/coreui-angular/CLI.md b/projects/coreui-angular/CLI.md new file mode 100644 index 00000000..cd0a31a1 --- /dev/null +++ b/projects/coreui-angular/CLI.md @@ -0,0 +1,27 @@ +# @coreui/angular v5 + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 19.1.0. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/projects/coreui-angular/LICENSE b/projects/coreui-angular/LICENSE index 1f38323c..fbb053e0 100644 --- a/projects/coreui-angular/LICENSE +++ b/projects/coreui-angular/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 creativeLabs Łukasz Holeczek +Copyright (c) 2025 creativeLabs Łukasz Holeczek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/projects/coreui-angular/README.md b/projects/coreui-angular/README.md index fc3a6487..5fb030b2 100644 --- a/projects/coreui-angular/README.md +++ b/projects/coreui-angular/README.md @@ -1,5 +1,5 @@

- + CoreUI logo

-

CoreUI for Angular

+

CoreUI Components for Angular

- Angular Components Library built on top of Bootstrap 5 and TypeScript. + Angular Components Library built on top of Bootstrap 5.3 and TypeScript 5.x
-
Explore CoreUI for Angular docs » + Explore CoreUI for Angular docs and examples »
-
- Report a bug + CoreUI Docs + · + Report a bug · - Request a feature + Request a feature · - Blog + Blog

+
+

+Featured CoreUI for Angular libraries: +
CoreUI Components for Angular +
CoreUI Angular wrapper for Chart.js v4 +
CoreUI Icons for Angular +

+
+ -## Status +### Status ![angular][angular-badge] +[![npm-coreui-angular-v5-ng19][npm-coreui-angular-badge-v5-ng19]][npm-coreui-angular] [![npm-coreui-angular-latest][npm-coreui-angular-badge-latest]][npm-coreui-angular] [![npm-coreui-angular-next][npm-coreui-angular-badge-next]][npm-coreui-angular] [![NPM downloads][npm-coreui-angular-download]][npm-coreui-angular] [![Build](https://github.com/coreui/coreui-angular/actions/workflows/build-check.yml/badge.svg)](https://github.com/coreui/coreui-angular/actions/workflows/build-check.yml) -[npm-coreui-angular-badge-latest]: https://img.shields.io/npm/v/@coreui/angular/latest?style=flat-square&color=brightgreen -[npm-coreui-angular-badge-next]: https://img.shields.io/npm/v/@coreui/angular/next?style=flat-square&color=red -[npm-coreui-angular]: https://www.npmjs.com/package/@coreui/angular -[npm-coreui-angular-download]: https://img.shields.io/npm/dm/@coreui/angular.svg?style=flat-square -[angular-badge]: https://img.shields.io/badge/angular-^14.2.0-lightgrey.svg?style=flat-square&logo=angular ## Table of contents - [Status](#status) +- [Table of contents](#table-of-contents) - [Quick start](#quick-start) + - [Prerequisites](#prerequisites) + - [Node.js](#nodejs) + - [Angular CLI](#angular-cli) + - [Installation](#installation) + - [CoreUI CSS files](#coreui-css-files) + - [Installation](#installation-1) + - [Basic usage](#basic-usage) + - [Bootstrap CSS files](#bootstrap-css-files) + - [Installation (optional)](#installation-optional) - [Templates](#templates) - [Bugs and feature requests](#bugs-and-feature-requests) - [Documentation](#documentation) @@ -59,7 +78,7 @@ Before you begin, make sure your development environment includes `Node.js®` and `npm` package manager. ###### Node.js -[**Angular 14**](https://angular.io/guide/what-is-angular) requires `Node.js` LTS version `^14.15` or `^16.10`. +[**Angular 19**](https://angular.dev/overview) requires `Node.js` LTS version `^18.19`, `^20.11` or `^22.0`. - To check your version, run `node -v` in a terminal/console window. - To get `Node.js`, go to [nodejs.org](https://nodejs.org/). @@ -71,13 +90,14 @@ Install the Angular CLI globally using a terminal/console window. npm install -g @angular/cli ``` -### Instalation +### Installation Several quick start options are available (pick one): - -- [Download the latest release](https://github.com/coreui/coreui-angular/) -- Clone the repo: `git clone https://github.com/coreui/coreui-angular.git` -- Install with [npm](https://www.npmjs.com/): `npm install @coreui/angular` -- Install with [yarn](https://yarnpkg.com/): `yarn add @coreui/angular` +- Add CoreUI to your Angular project: + - Install with [Angular CLI](https://angular.dev/cli/add): `ng add @coreui/angular` + - Install with [npm](https://www.npmjs.com/): `npm install @coreui/angular @coreui/icons-angular @coreui/coreui` +- Get the source code: + - [Download the latest release](https://github.com/coreui/coreui-angular/) + - Clone the repo: `git clone https://github.com/coreui/coreui-angular.git` Read the [Getting started page](https://coreui.io/angular/docs/) for information on the framework contents, templates and examples, and more. @@ -92,7 +112,7 @@ npm install @coreui/coreui --save ##### Basic usage ```scss -import '~@coreui/coreui/dist/css/coreui.min.css' +@import "@coreui/coreui/scss/coreui"; ``` #### Bootstrap CSS files @@ -118,7 +138,7 @@ The documentation for the CoreUI & CoreUI PRO is hosted at our website [CoreUI f ## Frameworks -CoreUI supports most popular frameworks. +CoreUI supports the most popular frameworks. - [CoreUI for Bootstap(Vanilla JS)](https://github.com/coreui/coreui) - [CoreUI for React](https://github.com/coreui/coreui-react) @@ -209,4 +229,11 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2022 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2025 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). + +[npm-coreui-angular-badge-v5-ng19]: https://img.shields.io/npm/v/@coreui/angular/v5-ng19?style=flat-square&color=brightgreen +[npm-coreui-angular-badge-latest]: https://img.shields.io/npm/v/@coreui/angular/latest?style=flat-square&color=brightgreen +[npm-coreui-angular-badge-next]: https://img.shields.io/npm/v/@coreui/angular/next?style=flat-square&color=red +[npm-coreui-angular]: https://www.npmjs.com/package/@coreui/angular +[npm-coreui-angular-download]: https://img.shields.io/npm/dm/@coreui/angular.svg?style=flat-square +[angular-badge]: https://img.shields.io/badge/angular-^19.2.0-lightgrey.svg?style=flat-square&logo=angular diff --git a/projects/coreui-angular/eslint.config.js b/projects/coreui-angular/eslint.config.js new file mode 100644 index 00000000..3296f55e --- /dev/null +++ b/projects/coreui-angular/eslint.config.js @@ -0,0 +1,25 @@ +// @ts-check +const tseslint = require('typescript-eslint'); +const rootConfig = require('../../eslint.config.js'); + +module.exports = tseslint.config( + ...rootConfig, + { + files: ['**/*.ts'], + rules: { + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-tslint-comment': 'off', + '@typescript-eslint/class-literal-property-style': 'off', + '@typescript-eslint/consistent-generic-constructors': 'off', + '@typescript-eslint/consistent-type-assertions': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + 'no-extra-boolean-cast': 'off', + 'no-unused-private-class-members': 'off' + } + }, + { + files: ['**/*.html'], + rules: {} + } +); diff --git a/projects/coreui-angular/karma.conf.js b/projects/coreui-angular/karma.conf.js index 513ee5d1..4d162381 100644 --- a/projects/coreui-angular/karma.conf.js +++ b/projects/coreui-angular/karma.conf.js @@ -27,17 +27,20 @@ module.exports = function (config) { coverageReporter: { dir: require('path').join(__dirname, '../../coverage/coreui-angular'), subdir: '.', - reporters: [ - { type: 'html' }, - { type: 'text-summary' } - ] + reporters: [{ type: 'html' }, { type: 'text-summary' }] }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['Chrome'], + browsers: ['Chrome_Custom'], + customLaunchers: { + Chrome_Custom: { + base: 'Chrome', + flags: ['--disable-search-engine-choice-screen'] + } + }, singleRun: false, restartOnFileChange: true }); diff --git a/projects/coreui-angular/package.json b/projects/coreui-angular/package.json index 6242e5c1..e39d26f2 100644 --- a/projects/coreui-angular/package.json +++ b/projects/coreui-angular/package.json @@ -1,7 +1,8 @@ { "name": "@coreui/angular", - "version": "4.2.18", - "description": "CoreUI for Angular UI components library", + "version": "5.4.9", + "description": "CoreUI Components Library for Angular", + "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT", "homepage": "https://coreui.io/angular", "author": { @@ -17,18 +18,23 @@ } ], "dependencies": { - "@popperjs/core": "~2.11.6", + "@popperjs/core": "~2.11.8", "tslib": "^2.3.0" }, + "sideEffects": false, "peerDependencies": { - "@angular/cdk": "^14.0.0", - "@angular/common": "^14.0.0", - "@angular/core": "^14.0.0", - "@angular/router": "^14.0.0" + "@angular/animations": "^19.2.0", + "@angular/cdk": "^19.2.0", + "@angular/common": "^19.2.0", + "@angular/core": "^19.2.0", + "@angular/router": "^19.2.0", + "@coreui/coreui": "~5.2.0 || ~5.3.1", + "@coreui/icons-angular": "~5.4.9", + "rxjs": "^7.8.2" }, "repository": { "type": "git", - "url": "https://github.com/coreui/coreui-angular.git" + "url": "git+https://github.com/coreui/coreui-angular.git" }, "bugs": { "url": "https://github.com/coreui/coreui-angular/issues" @@ -43,7 +49,17 @@ "component", "components" ], - "eslintConfig": { - + "eslintConfig": {}, + "devDependencies": { + "copyfiles": "file:../../node_modules/copyfiles", + "typescript": "file:../../node_modules/typescript" + }, + "schematics": "./schematics/collection.json", + "scripts": { + "build": "tsc -p tsconfig.schematics.json", + "postbuild": "copyfiles schematics/*/files/** schematics/collection.json ../../dist/coreui-angular/" + }, + "ng-add": { + "save": true } } diff --git a/projects/coreui-angular/schematics/collection.json b/projects/coreui-angular/schematics/collection.json new file mode 100644 index 00000000..a1cb4b7f --- /dev/null +++ b/projects/coreui-angular/schematics/collection.json @@ -0,0 +1,9 @@ +{ + "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", + "schematics": { + "ng-add": { + "description": "Add @coreui/angular library to the project.", + "factory": "./ng-add/index#ngAdd" + } + } +} diff --git a/projects/coreui-angular/schematics/ng-add/index.ts b/projects/coreui-angular/schematics/ng-add/index.ts new file mode 100644 index 00000000..54ce8f91 --- /dev/null +++ b/projects/coreui-angular/schematics/ng-add/index.ts @@ -0,0 +1,77 @@ +import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics'; +import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; +import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies'; +import { getPackageVersionFromPackageJson, PackageJson } from './package-config'; +import * as pkgJson from '../../package.json'; + +export function ngAdd(): Rule { + return (tree: Tree, context: SchematicContext) => { + const pkg = pkgJson as unknown as PackageJson; + + context.logger.info(``); + context.logger.info(`Installing ${pkg.name} dependencies...`); + + const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core'); + context.logger.info(`@angular/core version ${ngCoreVersionTag}`); + if (!ngCoreVersionTag) { + throw new SchematicsException('@angular/core version not found'); + } + + const projectDeps: NodeDependency[] = [ + { name: '@angular/animations', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false }, + { name: '@angular/common', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false }, + { name: '@angular/core', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false }, + { name: '@angular/router', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false } + ]; + + projectDeps.forEach((dep) => { + addPackageJsonDependency(tree, dep); + context.logger.info(`Added dependency: ${dep.name}@${dep.version}`); + }); + + const libraryDeps: NodeDependency[] = [ + { + name: '@angular/cdk', + type: NodeDependencyType.Default, + version: pkg.peerDependencies['@angular/cdk'], + overwrite: false + }, + { + name: '@coreui/coreui', + type: NodeDependencyType.Default, + version: pkg.peerDependencies['@coreui/coreui'], + overwrite: true + }, + { + name: '@coreui/icons-angular', + type: NodeDependencyType.Default, + version: pkg.peerDependencies['@coreui/icons-angular'], + overwrite: true + }, + { + name: '@popperjs/core', + type: NodeDependencyType.Default, + version: pkg.dependencies['@popperjs/core'], + overwrite: true + } + ]; + + libraryDeps.forEach((dep) => { + addPackageJsonDependency(tree, dep); + context.logger.info(`Added dependency: ${dep.name}@${dep.version}`); + }); + + const library: NodeDependency = { + name: pkg.name, + type: NodeDependencyType.Default, + version: `~${pkg.version}`, + overwrite: true + }; + + addPackageJsonDependency(tree, library); + context.logger.info(`Installing ${library.name}@${library.version}`); + context.addTask(new NodePackageInstallTask()); + + return tree; + }; +} diff --git a/projects/coreui-angular/schematics/ng-add/package-config.ts b/projects/coreui-angular/schematics/ng-add/package-config.ts new file mode 100644 index 00000000..95c3c1d1 --- /dev/null +++ b/projects/coreui-angular/schematics/ng-add/package-config.ts @@ -0,0 +1,68 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import { Tree } from '@angular-devkit/schematics'; + +export interface PackageJson { + dependencies: Record; + name: string; + peerDependencies: Record; + version: string; +} + +/** + * Sorts the keys of the given object. + * @returns A new object instance with sorted keys + */ +function sortObjectByKeys(obj: Record) { + return Object.keys(obj) + .sort() + .reduce( + (result, key) => { + result[key] = obj[key]; + return result; + }, + {} as Record + ); +} + +/** Adds a package to the package.json in the given host tree. */ +export function addPackageToPackageJson(host: Tree, pkg: string, version: string): Tree { + if (host.exists('package.json')) { + const sourceText = host.read('package.json')!.toString('utf-8'); + const json = JSON.parse(sourceText) as PackageJson; + + if (!json.dependencies) { + json.dependencies = {}; + } + + if (!json.dependencies[pkg]) { + json.dependencies[pkg] = version; + json.dependencies = sortObjectByKeys(json.dependencies); + } + + host.overwrite('package.json', JSON.stringify(json, null, 2)); + } + + return host; +} + +/** Gets the version of the specified package by looking at the package.json in the given tree. */ +export function getPackageVersionFromPackageJson(tree: Tree, name: string): string | null { + if (!tree.exists('package.json')) { + return null; + } + + const packageJson = JSON.parse(tree.read('package.json')!.toString('utf8')) as PackageJson; + + if (packageJson.dependencies && packageJson.dependencies[name]) { + return packageJson.dependencies[name]; + } + + return null; +} diff --git a/projects/coreui-angular/src/index.ts b/projects/coreui-angular/src/index.ts new file mode 100644 index 00000000..7e1a213e --- /dev/null +++ b/projects/coreui-angular/src/index.ts @@ -0,0 +1 @@ +export * from './public-api'; diff --git a/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.spec.ts b/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.spec.ts index 1211f48c..f0388eee 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.spec.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.spec.ts @@ -1,8 +1,11 @@ import { AccordionButtonDirective } from './accordion-button.directive'; +import { TestBed } from '@angular/core/testing'; describe('AccordionButtonDirective', () => { it('should create an instance', () => { - const directive = new AccordionButtonDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new AccordionButtonDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.ts b/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.ts index 7461463d..308ddf76 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion-button/accordion-button.directive.ts @@ -1,33 +1,29 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; @Directive({ - selector: '[cAccordionButton]' + selector: '[cAccordionButton]', + host: { '[class]': 'hostClasses()', '[attr.type]': 'type()', '[attr.aria-expanded]': 'ariaExpanded()' } }) export class AccordionButtonDirective { - /** * Toggles an accordion button collapsed state. Use in accordionHeaderTemplate. [docs] * @type boolean */ - @Input() collapsed!: boolean; + readonly collapsed = input(undefined); /** - * Default type for cAccordionButton. [docs] + * Default type for cAccordionButton. [docs] * @type string * @default 'button' */ - @HostBinding('attr.type') - @Input() type = 'button'; + readonly type = input('button'); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { 'accordion-button': true, - collapsed: this.collapsed - }; - } + collapsed: this.collapsed() + } as Record; + }); - @HostBinding('attr.aria-expanded') get ariaExpanded(): boolean { - return !this.collapsed; - } + readonly ariaExpanded = computed(() => !this.collapsed()); } diff --git a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html index b03adadc..7c82ca98 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html +++ b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html @@ -1,32 +1,33 @@ +@let tmpl = templates();
- +
-
- +
+
- - +
+ *ngTemplateOutlet="tmpl['accordionBody'] || defaultAccordionBodyContentTemplate; context: itemContext">
- + diff --git a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.spec.ts b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.spec.ts index bdcc8cfd..5c4ebac1 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.spec.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.spec.ts @@ -1,31 +1,42 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AccordionItemComponent } from './accordion-item.component'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { CollapseModule } from '../../collapse'; -import { AccordionService } from '../accordion.service'; import { AccordionButtonDirective } from '../accordion-button/accordion-button.directive'; +import { AccordionService } from '../accordion.service'; +import { AccordionItemComponent } from './accordion-item.component'; +import { ComponentRef } from '@angular/core'; describe('AccordionItemComponent', () => { let component: AccordionItemComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ AccordionItemComponent, AccordionButtonDirective ], providers: [AccordionService], - imports: [NoopAnimationsModule, CollapseModule] - }) - .compileComponents(); + imports: [NoopAnimationsModule, AccordionButtonDirective, AccordionItemComponent] + }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(AccordionItemComponent); component = fixture.componentInstance; + componentRef = fixture.componentRef; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('accordion-item'); + }); + + it('should toggle item', () => { + expect(component.visible).toBeFalse(); + component.toggleItem(); + expect(component.visible).toBeTrue(); + component.toggleItem(); + expect(component.visible).toBeFalse(); + }); }); diff --git a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.ts b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.ts index d73db69f..f1235a36 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.ts @@ -1,16 +1,22 @@ import { - AfterContentInit, + booleanAttribute, Component, - ContentChildren, - HostBinding, - Input, + computed, + contentChildren, + effect, + inject, + input, OnDestroy, - OnInit, QueryList, + OnInit, + signal, + TemplateRef } from '@angular/core'; +import { NgTemplateOutlet } from '@angular/common'; -import { AccordionService } from '../accordion.service'; +import { CollapseDirective } from '../../collapse'; import { TemplateIdDirective } from '../../shared'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { AccordionButtonDirective } from '../accordion-button/accordion-button.directive'; +import { AccordionService } from '../accordion.service'; let nextId = 0; @@ -19,66 +25,61 @@ let nextId = 0; templateUrl: './accordion-item.component.html', styleUrls: ['./accordion-item.component.scss'], exportAs: 'cAccordionItem', + imports: [AccordionButtonDirective, NgTemplateOutlet, CollapseDirective], + host: { class: 'accordion-item' } }) -export class AccordionItemComponent implements OnInit, OnDestroy, AfterContentInit { - - static ngAcceptInputType_visible: BooleanInput; +export class AccordionItemComponent implements OnInit, OnDestroy { + readonly #accordionService = inject(AccordionService); /** * Toggle an accordion item programmatically - * @type boolean + * @return boolean * @default false */ - @Input() - set visible(value: boolean){ - this._visible = coerceBooleanProperty(value); + // eslint-disable-next-line @angular-eslint/no-input-rename + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); + + readonly itemVisible = signal(false); + + readonly #visibleInputChange = effect(() => { + this.visible = this.visibleInput(); + }); + + set visible(value: boolean) { + this.itemVisible.set(value); } + get visible() { - return this._visible; + return this.itemVisible(); } - private _visible: boolean = false; - @Input() - set open(value: boolean) { - console.warn('c-accordion-item "open" prop is deprecated, use "visible" prop instead.') - this.visible = value || this.visible; - } - get open() { - return this.visible; - } + contentId = `accordion-item-${nextId++}`; - @HostBinding('class') - get hostClasses(): any { - return { - 'accordion-item': true, - }; + get itemContext() { + return { $implicit: this.itemVisible() }; } - contentId = `accordion-item-${nextId++}`; - itemContext = { $implicit: this.visible }; - templates: any = {}; - @ContentChildren(TemplateIdDirective, {descendants: true}) contentTemplates!: QueryList; + readonly contentTemplates = contentChildren(TemplateIdDirective, { descendants: true }); - constructor( - private accordionService: AccordionService, - ) { } + readonly templates = computed(() => { + return this.contentTemplates().reduce( + (acc, child) => { + acc[child.id] = child.templateRef; + return acc; + }, + {} as Record> + ); + }); ngOnInit(): void { - this.accordionService.addItem(this); + this.#accordionService.addItem(this); } ngOnDestroy(): void { - this.accordionService.removeItem(this); + this.#accordionService.removeItem(this); } toggleItem(): void { - this.accordionService.toggleItem(this); - } - - ngAfterContentInit(): void { - this.contentTemplates.forEach((child: TemplateIdDirective) => { - this.templates[child.id] = child.templateRef; - }); + this.#accordionService.toggleItem(this); } } - diff --git a/projects/coreui-angular/src/lib/accordion/accordion.module.ts b/projects/coreui-angular/src/lib/accordion/accordion.module.ts index 915c5efe..34688f03 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion.module.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion.module.ts @@ -1,27 +1,19 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { AccordionComponent } from './accordion/accordion.component'; import { AccordionButtonDirective } from './accordion-button/accordion-button.directive'; import { AccordionItemComponent } from './accordion-item/accordion-item.component'; import { AccordionService } from './accordion.service'; -import { CollapseModule } from '../collapse'; -import { SharedModule } from '../shared'; @NgModule({ - declarations: [ - AccordionComponent, - AccordionButtonDirective, - AccordionItemComponent, - ], imports: [ - CommonModule, - CollapseModule, - SharedModule + AccordionButtonDirective, + AccordionComponent, + AccordionItemComponent ], exports: [ AccordionComponent, AccordionButtonDirective, - AccordionItemComponent, + AccordionItemComponent ], providers: [ AccordionService diff --git a/projects/coreui-angular/src/lib/accordion/accordion.service.ts b/projects/coreui-angular/src/lib/accordion/accordion.service.ts index e247c92c..7583b2a8 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion.service.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion.service.ts @@ -1,14 +1,11 @@ import { Injectable } from '@angular/core'; -import { AccordionItemComponent } from './accordion-item/accordion-item.component'; +import type { AccordionItemComponent } from './accordion-item/accordion-item.component'; @Injectable() export class AccordionService { - items: AccordionItemComponent[] = []; alwaysOpen = false; - constructor() { } - addItem(item: AccordionItemComponent): void { this.items.push(item); } @@ -21,7 +18,7 @@ export class AccordionService { } toggleItem(item: AccordionItemComponent): void { - item.visible = !item.visible; + item.itemVisible.update((value) => !value); this.closeOtherItems(item); } @@ -29,7 +26,7 @@ export class AccordionService { if (!this.alwaysOpen) { this.items.forEach((item: AccordionItemComponent) => { if (item !== openItem) { - item.visible = false; + item.itemVisible.set(false); } }); } diff --git a/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.spec.ts b/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.spec.ts index 326d21ba..2e2f494b 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.spec.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.spec.ts @@ -8,9 +8,9 @@ describe('AccordionComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ AccordionComponent ] + imports: [AccordionComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('AccordionComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('accordion'); + }); }); diff --git a/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts b/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts index a5f4c553..8abcf01f 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts @@ -1,46 +1,36 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { booleanAttribute, Component, computed, effect, inject, input } from '@angular/core'; import { AccordionService } from '../accordion.service'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; @Component({ selector: 'c-accordion', - template: ``, + template: '', styleUrls: ['./accordion.component.scss'], exportAs: 'cAccordionItem', - providers: [AccordionService] + providers: [AccordionService], + host: { '[class]': 'hostClasses()' } }) export class AccordionComponent { - - static ngAcceptInputType_alwaysOpen: BooleanInput; + readonly #accordionService = inject(AccordionService); /** * Removes the default background-color, some borders, and some rounded corners to render accordions edge-to-edge with their parent container. * @type boolean */ - @Input() flush?: boolean; + readonly flush = input(false, { transform: booleanAttribute }); + /** * Make accordion items stay open when another item is opened * @type boolean */ - @Input() - set alwaysOpen(value: boolean) { - this.accordionService.alwaysOpen = coerceBooleanProperty(value); - } - get alwaysOpen(): boolean { - return this.accordionService.alwaysOpen; - } - - @HostBinding('class') - get hostClasses(): any { - return { - accordion: true, - 'accordion-flush': !!this.flush - }; - } + readonly alwaysOpen = input(false, { transform: booleanAttribute }); - constructor( - private accordionService: AccordionService - ) {} + readonly #alwaysOpenEffect = effect(() => { + this.#accordionService.alwaysOpen = this.alwaysOpen(); + }); + readonly hostClasses = computed(() => ({ + accordion: true, + 'accordion-flush': this.flush() + }) as Record); } diff --git a/projects/coreui-angular/src/lib/alert/alert-heading.directive.ts b/projects/coreui-angular/src/lib/alert/alert-heading.directive.ts index cb0937a5..6c47fa49 100644 --- a/projects/coreui-angular/src/lib/alert/alert-heading.directive.ts +++ b/projects/coreui-angular/src/lib/alert/alert-heading.directive.ts @@ -1,18 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cAlertHeading]' + selector: '[cAlertHeading]', + host: { class: 'alert-heading' } }) -export class AlertHeadingDirective { - - @HostBinding('class') - get hostClasses(): any { - - return { - 'alert-heading': true, - }; - } - - constructor() { } - -} +export class AlertHeadingDirective {} diff --git a/projects/coreui-angular/src/lib/alert/alert-link.directive.ts b/projects/coreui-angular/src/lib/alert/alert-link.directive.ts index f869bb2e..b842f743 100644 --- a/projects/coreui-angular/src/lib/alert/alert-link.directive.ts +++ b/projects/coreui-angular/src/lib/alert/alert-link.directive.ts @@ -1,18 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cAlertLink]' + selector: '[cAlertLink]', + host: { class: 'alert-link' } }) -export class AlertLinkDirective { - - @HostBinding('class') - get hostClasses(): any { - - return { - 'alert-link': true, - }; - } - - constructor() { } - -} +export class AlertLinkDirective {} diff --git a/projects/coreui-angular/src/lib/alert/alert.component.html b/projects/coreui-angular/src/lib/alert/alert.component.html index 5c0762a6..24f1e1e1 100644 --- a/projects/coreui-angular/src/lib/alert/alert.component.html +++ b/projects/coreui-angular/src/lib/alert/alert.component.html @@ -1,11 +1,9 @@ - - - - - - - - +@if (visible || !hide()) { + @if (dismissible) { + + } + +} diff --git a/projects/coreui-angular/src/lib/alert/alert.component.spec.ts b/projects/coreui-angular/src/lib/alert/alert.component.spec.ts index 7705ebdf..cf4a7f4f 100644 --- a/projects/coreui-angular/src/lib/alert/alert.component.spec.ts +++ b/projects/coreui-angular/src/lib/alert/alert.component.spec.ts @@ -2,26 +2,55 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { AlertComponent } from './alert.component'; +import { ComponentRef } from '@angular/core'; describe('AlertComponent', () => { let component: AlertComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ AlertComponent ], - imports: [BrowserAnimationsModule] - }) - .compileComponents(); + imports: [BrowserAnimationsModule, AlertComponent, BrowserAnimationsModule] + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(AlertComponent); component = fixture.componentInstance; + componentRef = fixture.componentRef; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes and styles', () => { + expect(fixture.nativeElement).toHaveClass('alert'); + expect(fixture.nativeElement).toHaveClass('alert-primary'); + expect(fixture.nativeElement).toHaveClass('show'); + expect(fixture.nativeElement.style.opacity).toBe('1'); + componentRef.setInput('visible', false); + componentRef.setInput('color', 'danger'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('alert-danger'); + expect(fixture.nativeElement.style.opacity).toBe('0'); + expect(fixture.nativeElement.style.height).toBe('0px'); + componentRef.setInput('dismissible', true); + componentRef.setInput('fade', true); + componentRef.setInput('variant', 'solid'); + componentRef.setInput('visible', true); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('alert-dismissible'); + expect(fixture.nativeElement).toHaveClass('fade'); + expect(fixture.nativeElement).not.toHaveClass('alert-danger'); + expect(fixture.nativeElement).toHaveClass('bg-danger'); + expect(fixture.nativeElement).toHaveClass('text-white'); + expect(fixture.nativeElement.style).toHaveSize(0); + }); + + it('should have attributes', () => { + expect(fixture.nativeElement.getAttribute('role')).toBe('alert'); + }); }); diff --git a/projects/coreui-angular/src/lib/alert/alert.component.ts b/projects/coreui-angular/src/lib/alert/alert.component.ts index 6809a8d6..fb821458 100644 --- a/projects/coreui-angular/src/lib/alert/alert.component.ts +++ b/projects/coreui-angular/src/lib/alert/alert.component.ts @@ -1,171 +1,173 @@ import { - AfterContentInit, + booleanAttribute, Component, - ContentChildren, - EventEmitter, - HostBinding, - HostListener, - Input, - Output, - QueryList + computed, + contentChildren, + input, + linkedSignal, + output, + signal, + TemplateRef } from '@angular/core'; +import { NgTemplateOutlet } from '@angular/common'; import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { Colors } from '../coreui.types'; import { TemplateIdDirective } from '../shared'; +import { ButtonCloseDirective } from '../button'; -type AnimateType = ('hide' | 'show'); +type AnimateType = 'hide' | 'show'; @Component({ selector: 'c-alert', templateUrl: './alert.component.html', styleUrls: ['./alert.component.scss'], exportAs: 'cAlert', + imports: [NgTemplateOutlet, ButtonCloseDirective], animations: [ trigger('fadeInOut', [ - state('show', style({opacity: 1, height: '*', padding: '*', border: '*', margin: '*'})), - state('hide', style({opacity: 0, height: 0, padding: 0, border: 0, margin: 0})), - state('void', style({opacity: 0, height: 0, padding: 0, border: 0, margin: 0})), - transition('show => hide', [ - animate('.3s ease-out'), - ]), - transition('hide => show', [ - animate('.3s ease-in'), - ]), - transition('show => void', [ - animate('.3s ease-out'), - ]), - transition('void => show', [ - animate('.3s ease-in'), - ]), + state('show', style({ opacity: 1, height: '*', padding: '*', border: '*', margin: '*' })), + state('hide', style({ opacity: 0, height: 0, padding: 0, border: 0, margin: 0 })), + state('void', style({ opacity: 0, height: 0, padding: 0, border: 0, margin: 0 })), + transition('show => hide', [animate('.3s ease-out')]), + transition('hide => show', [animate('.3s ease-in')]), + transition('show => void', [animate('.3s ease-out')]), + transition('void => show', [animate('.3s ease-in')]) ]) - ] + ], + host: { + '[@.disabled]': '!fade()', + '[@fadeInOut]': 'animateType', + '[attr.role]': 'role()', + '[class]': 'hostClasses()', + '(@fadeInOut.start)': 'onAnimationStart($event)', + '(@fadeInOut.done)': 'onAnimationDone($event)' + } }) -export class AlertComponent implements AfterContentInit { - - static ngAcceptInputType_dismissible: BooleanInput; - static ngAcceptInputType_fade: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; - - hide!: boolean; +export class AlertComponent { /** * Sets the color context of the component to one of CoreUI’s themed colors. - * - * @type Colors + * @return Colors * @default 'primary' */ - @Input() color: Colors = 'primary'; + readonly color = input('primary'); /** - * Optionally adds a close button to alert and allow it to self dismiss. - * @type boolean + * Default role for alert. [docs] + * @return string + * @default 'alert' */ - @Input() - get dismissible(): boolean { - return this._dismissible; - } - set dismissible(value: boolean) { - this._dismissible = coerceBooleanProperty(value); - } - private _dismissible = false; + readonly role = input('alert'); /** - * Adds animation for dismissible alert. - * @type boolean + * Set the alert variant to a solid. + * @return string */ - @Input() - get fade(): boolean { - return this._fade; - } - set fade(value: boolean) { - this._fade = coerceBooleanProperty(value); - } - private _fade = false; + readonly variant = input<'solid'>(); /** - * Default role for alert. [docs] - * @type string - * @default 'alert' + * Optionally adds a close button to alert and allow it to self dismiss. + * @return boolean + * @default false */ - @HostBinding('attr.role') - @Input() role = 'alert'; + readonly dismissibleInput = input(false, { transform: booleanAttribute, alias: 'dismissible' }); + + readonly #dismissible = linkedSignal({ + source: this.dismissibleInput, + computation: (value) => { + return value; + } + }); + + set dismissible(value: boolean) { + this.#dismissible.set(value); + } + + get dismissible() { + return this.#dismissible(); + } /** - * Set the alert variant to a solid. - * @type string + * Adds animation for dismissible alert. + * @return boolean */ - @Input() variant?: 'solid' | string; + readonly fade = input(false, { transform: booleanAttribute }); /** * Toggle the visibility of alert component. - * @type boolean + * @return boolean */ - @Input() + readonly visibleInput = input(true, { transform: booleanAttribute, alias: 'visible' }); + + readonly #visible = linkedSignal({ + source: this.visibleInput, + computation: (value) => { + return value; + } + }); + set visible(value: boolean) { - if (this._visible !== value) { - this._visible = coerceBooleanProperty(value); + if (this.#visible() !== value) { + this.#visible.set(value); this.visibleChange.emit(value); } - }; + } + get visible() { - return this._visible; + return this.#visible(); } - private _visible = true; + + readonly hide = signal(false); /** * Event triggered on the alert dismiss. */ - @Output() visibleChange: EventEmitter = new EventEmitter(); + readonly visibleChange = output(); - templates: any = {}; - @ContentChildren(TemplateIdDirective, {descendants: true}) contentTemplates!: QueryList; + readonly contentTemplates = contentChildren(TemplateIdDirective, { descendants: true }); - @HostBinding('@.disabled') - get animationDisabled(): boolean { - return !this.fade; - } + readonly templates = computed(() => { + return this.contentTemplates().reduce( + (acc, child) => { + acc[child.id] = child.templateRef; + return acc; + }, + {} as Record> + ); + }); - @HostBinding('@fadeInOut') get animateType(): AnimateType { return this.visible ? 'show' : 'hide'; } - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const color = this.color(); + const variant = this.variant(); return { alert: true, 'alert-dismissible': this.dismissible, - fade: this.fade, - show: !this.hide, - [`alert-${this.color}`]: !!this.color && this.variant !== 'solid', - [`bg-${this.color}`]: !!this.color && this.variant === 'solid', - 'text-white': !!this.color && this.variant === 'solid' - }; - } + fade: this.fade(), + show: !this.hide(), + [`alert-${color}`]: !!color && variant !== 'solid', + [`bg-${color}`]: !!color && variant === 'solid', + 'text-white': !!color && variant === 'solid' + } as Record; + }); - @HostListener('@fadeInOut.start', ['$event']) onAnimationStart($event: AnimationEvent): void { this.onAnimationEvent($event); } - @HostListener('@fadeInOut.done', ['$event']) onAnimationDone($event: AnimationEvent): void { this.onAnimationEvent($event); } - ngAfterContentInit(): void { - this.contentTemplates.forEach((child: TemplateIdDirective) => { - this.templates[child.id] = child.templateRef; - }); - } - onAnimationEvent(event: AnimationEvent): void { - this.hide = event.phaseName === 'start' && event.toState === 'show'; + this.hide.set(event.phaseName === 'start' && event.toState === 'show'); if (event.phaseName === 'done') { - this.hide = (event.toState === 'hide' || event.toState === 'void'); + this.hide.set(event.toState === 'hide' || event.toState === 'void'); if (event.toState === 'show') { - this.hide = false; + this.hide.set(false); } } } diff --git a/projects/coreui-angular/src/lib/alert/alert.module.ts b/projects/coreui-angular/src/lib/alert/alert.module.ts index 0ad64164..030ea0ce 100644 --- a/projects/coreui-angular/src/lib/alert/alert.module.ts +++ b/projects/coreui-angular/src/lib/alert/alert.module.ts @@ -1,22 +1,16 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { AlertComponent } from './alert.component'; import { AlertHeadingDirective } from './alert-heading.directive'; import { AlertLinkDirective } from './alert-link.directive'; -import { ButtonModule } from '../button'; @NgModule({ imports: [ - CommonModule, - ButtonModule - ], - exports: [ AlertComponent, AlertHeadingDirective, AlertLinkDirective ], - declarations: [ + exports: [ AlertComponent, AlertHeadingDirective, AlertLinkDirective diff --git a/projects/coreui-angular/src/lib/avatar/avatar.component.html b/projects/coreui-angular/src/lib/avatar/avatar.component.html index a3c3f737..82a6e9f3 100644 --- a/projects/coreui-angular/src/lib/avatar/avatar.component.html +++ b/projects/coreui-angular/src/lib/avatar/avatar.component.html @@ -1,11 +1,21 @@ - - - - + + @if (src()) { + @defer (prefetch on idle) { + {{alt()}} + } @placeholder () { + + + + } + } + +@if (!!status()) { + +} - - - - - - diff --git a/projects/coreui-angular/src/lib/avatar/avatar.component.scss b/projects/coreui-angular/src/lib/avatar/avatar.component.scss index e69de29b..ddbc3efc 100644 --- a/projects/coreui-angular/src/lib/avatar/avatar.component.scss +++ b/projects/coreui-angular/src/lib/avatar/avatar.component.scss @@ -0,0 +1,5 @@ +:host { + .avatar-img { + object-fit: cover; + } +} diff --git a/projects/coreui-angular/src/lib/avatar/avatar.component.spec.ts b/projects/coreui-angular/src/lib/avatar/avatar.component.spec.ts index 7c3ee671..35566e8f 100644 --- a/projects/coreui-angular/src/lib/avatar/avatar.component.spec.ts +++ b/projects/coreui-angular/src/lib/avatar/avatar.component.spec.ts @@ -8,9 +8,9 @@ describe('AvatarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ AvatarComponent ] + imports: [AvatarComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('AvatarComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('avatar'); + }); }); diff --git a/projects/coreui-angular/src/lib/avatar/avatar.component.ts b/projects/coreui-angular/src/lib/avatar/avatar.component.ts index b496a13b..1f036fdc 100644 --- a/projects/coreui-angular/src/lib/avatar/avatar.component.ts +++ b/projects/coreui-angular/src/lib/avatar/avatar.component.ts @@ -1,61 +1,79 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { NgClass } from '@angular/common'; +import { Component, computed, input, InputSignal } from '@angular/core'; + import { Colors, Shapes, Sizes, TextColors } from '../coreui.types'; +import { TextColorDirective } from '../utilities'; @Component({ selector: 'c-avatar', templateUrl: './avatar.component.html', - styleUrls: ['./avatar.component.scss'] + styleUrls: ['./avatar.component.scss'], + imports: [NgClass], + hostDirectives: [ + { + directive: TextColorDirective, + inputs: ['cTextColor: textColor'] + } + ], + host: { class: 'avatar', '[class]': 'hostClasses()' } }) export class AvatarComponent { /** * Sets the background color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() color?: Colors; + readonly color: InputSignal = input(); + /** * Select the shape of the component. * @type Shapes */ - @Input() shape?: Shapes; + readonly shape: InputSignal = input(); + /** * Size the component small, large, or extra large. * @default 'md' */ - @Input() size?: Omit = 'md'; + readonly size: InputSignal> = input>(''); + + /** + * The alt attribute for the img element alternate text. + * @type string + */ + readonly alt: InputSignal = input(''); + /** * The src attribute for the img element. * @type string */ - @Input() src?: string; + readonly src: InputSignal = input(); + /** * Sets the color context of the status indicator to one of CoreUI’s themed colors. * @type Colors */ - @Input() status?: Colors; + readonly status: InputSignal = input(); + /** * Sets the text color of the component to one of CoreUI’s themed colors. - * - * @values 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | 'white' | 'muted' | string + * via TextColorDirective + * @type TextColors */ - @Input() textColor?: TextColors; - - constructor() { } + readonly textColor: InputSignal = input(); - get statusClass(): any { + readonly statusClass = computed(() => { return { 'avatar-status': true, - [`bg-${this.status}`]: !!this.status - }; - } + [`bg-${this.status()}`]: !!this.status() + } as Record; + }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { avatar: true, - [`avatar-${this.size}`]: !!this.size, - [`bg-${this.color}`]: !!this.color, - [`${this.shape}`]: !!this.shape, - [`text-${this.textColor}`]: !!this.textColor - }; - } + [`avatar-${this.size()}`]: !!this.size(), + [`bg-${this.color()}`]: !!this.color(), + [`${this.shape()}`]: !!this.shape() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/avatar/avatar.module.ts b/projects/coreui-angular/src/lib/avatar/avatar.module.ts index 2eb84651..83d96677 100644 --- a/projects/coreui-angular/src/lib/avatar/avatar.module.ts +++ b/projects/coreui-angular/src/lib/avatar/avatar.module.ts @@ -1,17 +1,12 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { AvatarComponent } from './avatar.component'; - @NgModule({ - declarations: [ - AvatarComponent - ], imports: [ - CommonModule + AvatarComponent ], exports: [ AvatarComponent ] }) -export class AvatarModule { } +export class AvatarModule {} diff --git a/projects/coreui-angular/src/lib/backdrop/backdrop.service.spec.ts b/projects/coreui-angular/src/lib/backdrop/backdrop.service.spec.ts index ff5fd53a..46243b1f 100644 --- a/projects/coreui-angular/src/lib/backdrop/backdrop.service.spec.ts +++ b/projects/coreui-angular/src/lib/backdrop/backdrop.service.spec.ts @@ -1,16 +1,59 @@ -import { TestBed } from '@angular/core/testing'; +import { fakeAsync, TestBed, tick } from '@angular/core/testing'; import { BackdropService } from './backdrop.service'; +import { DOCUMENT } from '@angular/common'; describe('BackdropService', () => { let service: BackdropService; + let document: Document; + let backdrop: any; beforeEach(() => { TestBed.configureTestingModule({}); service = TestBed.inject(BackdropService); + document = TestBed.inject(DOCUMENT); }); + afterAll(() => { + expect(document.querySelector('.modal-backdrop')).toBeNull(); + }, 500); + it('should be created', () => { expect(service).toBeTruthy(); }); + + it('should set backdrop', fakeAsync(() => { + // expect(service.scrollbarWidth).toBe('0px'); + expect(document.querySelector('.modal-backdrop')).toBeNull(); + backdrop = service.setBackdrop(); + tick(); + expect(document.querySelector('.modal-backdrop')).not.toBeNull(); + expect(backdrop).toHaveClass('modal-backdrop'); + expect(backdrop).toHaveClass('fade'); + expect(backdrop).toHaveClass('show'); + service.clearBackdrop(backdrop); + expect(backdrop).not.toHaveClass('show'); + expect(document.querySelector('.modal-backdrop')).not.toBeNull(); + })); + + it('should hide scrollbar', () => { + service.hideScrollbar(); + expect(document.body.style.overflow).toBe('hidden'); + // expect(document.body.style.paddingRight).toBe('0px'); + }); + + it('should reset scrollbar', () => { + service.resetScrollbar(); + expect(document.body.style.overflow).not.toBe('hidden'); + }); + + it('should react to backdrop click', fakeAsync(() => { + backdrop = service.setBackdrop(); + tick(); + service.backdropClick$.subscribe((value) => { + expect(value).toBeTrue(); + }); + backdrop.dispatchEvent(new MouseEvent('click')); + service.clearBackdrop(backdrop); + })); }); diff --git a/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts b/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts index 2bf50bc3..9cf312e3 100644 --- a/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts +++ b/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core'; +import { inject, Injectable, RendererFactory2 } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { Subject } from 'rxjs'; @@ -6,47 +6,78 @@ import { Subject } from 'rxjs'; providedIn: 'root' }) export class BackdropService { + readonly #backdropClick = new Subject(); + readonly backdropClick$ = this.#backdropClick.asObservable(); - private backdropClick = new Subject(); - backdropClick$ = this.backdropClick.asObservable(); + #document = inject(DOCUMENT); + #rendererFactory = inject(RendererFactory2); + #renderer = this.#rendererFactory.createRenderer(null, null); + #unListen!: () => void; - private renderer: Renderer2; - private unListen!: () => void; + activeBackdrop: any; - constructor( - @Inject(DOCUMENT) private document: any, - private rendererFactory: RendererFactory2 - ) { - this.renderer = rendererFactory.createRenderer(null, null); + get #scrollbarWidth() { + // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes + const documentWidth = this.#document.documentElement.clientWidth; + const scrollbarWidth = Math.abs((this.#document.defaultView?.innerWidth ?? documentWidth) - documentWidth); + return `${scrollbarWidth}px`; } + scrollbarWidth = this.#scrollbarWidth; + setBackdrop(type: string = 'modal'): any { - const backdropElement = this.renderer.createElement('div'); - this.renderer.addClass(backdropElement, `${type}-backdrop`); - this.renderer.addClass(backdropElement, 'fade'); - this.renderer.appendChild(this.document.body, backdropElement); - this.unListen = this.renderer.listen(backdropElement, 'click', (e): void => { + const backdropElement = this.#renderer.createElement('div'); + this.#renderer.addClass(backdropElement, `${type}-backdrop`); + this.#renderer.addClass(backdropElement, 'fade'); + this.#renderer.appendChild(this.#document.body, backdropElement); + this.#unListen = this.#renderer.listen(backdropElement, 'click', (e): void => { this.onClickHandler(); }); + this.scrollbarWidth = this.#scrollbarWidth; setTimeout(() => { - this.renderer.addClass(backdropElement, 'show'); + this.#renderer.addClass(backdropElement, 'show'); + // this.hideScrollbar(); }); + this.activeBackdrop = backdropElement; return backdropElement; } - clearBackdrop(backdrop: any): any { - if (backdrop) { - this.unListen(); - this.renderer.removeClass(backdrop, 'show'); + clearBackdrop(backdropElement: any): any { + if (backdropElement) { + this.#unListen(); + this.#renderer.removeClass(backdropElement, 'show'); setTimeout(() => { - this.renderer.removeChild(this.document.body, backdrop); - backdrop = undefined; + if (this.activeBackdrop === backdropElement) { + this.resetScrollbar(); + } + this.#renderer.removeChild(this.#document.body, backdropElement); + backdropElement = undefined; }, 300); } - return backdrop; + return undefined; + } + + get #isRTL() { + return [this.#document.documentElement.dir, this.#document.body.dir].includes('rtl'); + } + + #scrollBarVisible = true; + + hideScrollbar(): void { + if (this.#scrollBarVisible) { + this.#renderer.setStyle(this.#document.body, 'overflow', 'hidden'); + this.#renderer.setStyle(this.#document.body, `padding-${this.#isRTL ? 'left' : 'right'}`, this.scrollbarWidth); + this.#scrollBarVisible = false; + } + } + + resetScrollbar(): void { + this.#renderer.removeStyle(this.#document.body, 'overflow'); + this.#renderer.removeStyle(this.#document.body, `padding-${this.#isRTL ? 'left' : 'right'}`); + this.#scrollBarVisible = true; } onClickHandler(): void { - this.backdropClick.next(true); + this.#backdropClick.next(true); } } diff --git a/projects/coreui-angular/src/lib/backdrop/index.ts b/projects/coreui-angular/src/lib/backdrop/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/coreui-angular/src/lib/backdrop/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/coreui-angular/src/lib/backdrop/public_api.ts b/projects/coreui-angular/src/lib/backdrop/public_api.ts new file mode 100644 index 00000000..af201b5c --- /dev/null +++ b/projects/coreui-angular/src/lib/backdrop/public_api.ts @@ -0,0 +1 @@ +export { BackdropService } from './backdrop.service'; diff --git a/projects/coreui-angular/src/lib/badge/badge.component.html b/projects/coreui-angular/src/lib/badge/badge.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/badge/badge.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/badge/badge.component.scss b/projects/coreui-angular/src/lib/badge/badge.component.scss deleted file mode 100644 index 8b137891..00000000 --- a/projects/coreui-angular/src/lib/badge/badge.component.scss +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/badge/badge.component.spec.ts b/projects/coreui-angular/src/lib/badge/badge.component.spec.ts index 6b63e579..ae6b84f3 100644 --- a/projects/coreui-angular/src/lib/badge/badge.component.spec.ts +++ b/projects/coreui-angular/src/lib/badge/badge.component.spec.ts @@ -8,9 +8,9 @@ describe('BadgeComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ BadgeComponent ] + imports: [BadgeComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('BadgeComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('badge'); + }); }); diff --git a/projects/coreui-angular/src/lib/badge/badge.component.ts b/projects/coreui-angular/src/lib/badge/badge.component.ts index 0731f179..99702ac0 100644 --- a/projects/coreui-angular/src/lib/badge/badge.component.ts +++ b/projects/coreui-angular/src/lib/badge/badge.component.ts @@ -1,57 +1,76 @@ -import { Component, HostBinding, Input } from '@angular/core'; -import { BadgePositions, Colors, Shapes } from '../coreui.types'; +import { Component, computed, input, InputSignal } from '@angular/core'; +import { BadgePositions, Colors, Shapes, TextColors } from '../coreui.types'; +import { TextBgColorDirective, TextColorDirective } from '../utilities'; @Component({ selector: 'c-badge', - templateUrl: './badge.component.html', - styleUrls: ['./badge.component.scss'], + template: '', + hostDirectives: [ + { directive: TextColorDirective, inputs: ['cTextColor: textColor'] }, + { directive: TextBgColorDirective, inputs: ['cTextBgColor: textBgColor'] } + ], + host: { + class: 'badge', + '[class]': 'hostClasses()' + } }) export class BadgeComponent { /** * Sets the color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() color?: Colors; + readonly color: InputSignal = input(); /** * Position badge in one of the corners of a link or button. * @type BadgePositions */ - @Input() position?: BadgePositions; + readonly position: InputSignal = input(); + /** * Select the shape of the component. * @type Shapes */ - @Input() shape?: Shapes; + readonly shape: InputSignal = input(); + /** * Size the component small. */ - @Input() size?: 'sm'; + readonly size: InputSignal<'sm' | undefined> = input(); + /** * Sets the text color of the component to one of CoreUI’s themed colors. + * via TextColorDirective * @type TextColors */ - @Input() textColor?: string; + readonly textColor: InputSignal = input(); - constructor() {} + /** + * Sets the component's color scheme to one of CoreUI's themed colors, ensuring the text color contrast adheres to the WCAG 4.5:1 contrast ratio standard for accessibility. + * via TextBgColorDirective + * @type Colors + * @since 5.0.0 + */ + readonly textBgColor: InputSignal = input(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const position = this.position(); const positionClasses = { - 'position-absolute': !!this.position, - 'translate-middle': !!this.position, - 'top-0': this.position?.includes('top'), - 'top-100': this.position?.includes('bottom'), - 'start-100': this.position?.includes('end'), - 'start-0': this.position?.includes('start'), + 'position-absolute': !!position, + 'translate-middle': !!position, + 'top-0': position?.includes('top'), + 'top-100': position?.includes('bottom'), + 'start-100': position?.includes('end'), + 'start-0': position?.includes('start') }; - return Object.assign({ + return Object.assign( + { badge: true, - [`bg-${this.color}`]: !!this.color, - [`text-${this.textColor}`]: !!this.textColor, - [`badge-${this.size}`]: !!this.size, - [`${this.shape}`]: !!this.shape, - }, !!this.position ? positionClasses : {} - ); - } + [`bg-${this.color()}`]: !!this.color(), + [`badge-${this.size()}`]: !!this.size(), + [`${this.shape()}`]: !!this.shape() + }, + !!position ? positionClasses : {} + ) as Record; + }); } diff --git a/projects/coreui-angular/src/lib/badge/badge.module.ts b/projects/coreui-angular/src/lib/badge/badge.module.ts index 691ac89f..64e46953 100644 --- a/projects/coreui-angular/src/lib/badge/badge.module.ts +++ b/projects/coreui-angular/src/lib/badge/badge.module.ts @@ -1,16 +1,12 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { BadgeComponent } from './badge.component'; @NgModule({ - declarations: [ - BadgeComponent - ], imports: [ - CommonModule + BadgeComponent ], exports: [ BadgeComponent ] }) -export class BadgeModule { } +export class BadgeModule {} diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.html b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.html index fea45be1..7c67d055 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.html +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.html @@ -1,24 +1,23 @@ - - - - - - - +@if (!active()) { + + + +} @else { + + - +} - + diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.spec.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.spec.ts index 52469a71..d2f39847 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.spec.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.spec.ts @@ -1,27 +1,49 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { SharedModule } from '../../shared'; import { BreadcrumbItemComponent } from './breadcrumb-item.component'; +import { provideRouter } from '@angular/router'; +import { ComponentRef } from '@angular/core'; describe('BreadcrumbItemComponent', () => { let component: BreadcrumbItemComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [BreadcrumbItemComponent], - imports: [SharedModule, RouterTestingModule] - }) - .compileComponents(); + imports: [BreadcrumbItemComponent], + providers: [provideRouter([])] + }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(BreadcrumbItemComponent); component = fixture.componentInstance; + componentRef = fixture.componentRef; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('breadcrumb-item'); + expect(fixture.nativeElement).not.toHaveClass('active'); + }); + + it('should have active class', () => { + componentRef.setInput('active', true); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('active'); + }); + + it('should have aria-current attribute', () => { + expect(fixture.nativeElement.getAttribute('aria-current')).toBeNull(); + componentRef.setInput('active', true); + fixture.detectChanges(); + expect(fixture.nativeElement.getAttribute('aria-current')).toBe('page'); + componentRef.setInput('active', false); + fixture.detectChanges(); + expect(fixture.nativeElement.getAttribute('aria-current')).toBeNull(); + }); }); diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts index 6cb88ccc..953fa61b 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts @@ -1,43 +1,54 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { booleanAttribute, Component, computed, input } from '@angular/core'; +import { NgTemplateOutlet } from '@angular/common'; +import { RouterModule } from '@angular/router'; + +import { HtmlAttributesDirective } from '../../shared'; import { INavAttributes, INavLinkProps } from './breadcrumb-item'; @Component({ selector: 'c-breadcrumb-item', templateUrl: './breadcrumb-item.component.html', - styleUrls: ['./breadcrumb-item.component.scss'] + styleUrls: ['./breadcrumb-item.component.scss'], + imports: [RouterModule, NgTemplateOutlet, HtmlAttributesDirective], + exportAs: 'breadcrumbItem', + host: { + '[attr.aria-current]': 'ariaCurrent()', + '[class]': 'hostClasses()' + } }) export class BreadcrumbItemComponent { - /** * Toggle the active state for the component. [docs] - * @type boolean + * @return boolean */ - @Input() active?: boolean; + readonly active = input(undefined, { transform: booleanAttribute }); + /** * The `url` prop for the inner `[routerLink]` directive. [docs] * @type string */ - @Input() url?: string | any[]; + readonly url = input(); + /** * Additional html attributes for link. [docs] * @type INavAttributes */ - @Input() attributes?: INavAttributes; + readonly attributes = input(); + /** * Some `NavigationExtras` props for the inner `[routerLink]` directive and `routerLinkActiveOptions`. [docs] * @type INavLinkProps */ - @Input() linkProps?: INavLinkProps; + readonly linkProps = input(); - @HostBinding('attr.aria-current') get ariaCurrent(): string | null { - return this.active ? 'page' : null; - } + readonly ariaCurrent = computed((): string | null => { + return this.active() ? 'page' : null; + }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { 'breadcrumb-item': true, - active: this.active - }; - } + active: this.active() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.ts index d82381a9..d87c0c4b 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.ts @@ -1,4 +1,4 @@ -import {INavAttributes, INavLinkProps} from '../../coreui.types'; +import { INavAttributes, INavLinkProps } from '../../coreui.types'; interface IBreadcrumbItem { label: string; @@ -6,6 +6,7 @@ interface IBreadcrumbItem { attributes?: INavAttributes; linkProps?: INavLinkProps; class?: string; + queryParams?: { [key: string]: any }; } -export { INavAttributes, INavLinkProps, IBreadcrumbItem }; +export type { INavAttributes, INavLinkProps, IBreadcrumbItem }; diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.html b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.html index 68125217..b20dbde4 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.html +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.html @@ -1,6 +1,6 @@ - - + @for (breadcrumb of breadcrumbs | async; track breadcrumb; let last = $last) { + @if (breadcrumb?.label && (breadcrumb?.url?.slice(-1) === '/' || last)) { {{ breadcrumb?.label }} - - + } + } diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.scss b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.scss deleted file mode 100644 index 88149dde..00000000 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -//:host .breadcrumb-item { -// display: list-item; -//} diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.spec.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.spec.ts index 5678a2c3..b3ba2669 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.spec.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.spec.ts @@ -1,34 +1,72 @@ +import { ComponentRef } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import {CommonModule} from '@angular/common'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Router } from '@angular/router'; +import { provideRouter, Route } from '@angular/router'; +import { RouterTestingHarness } from '@angular/router/testing'; +import { take } from 'rxjs'; import { BreadcrumbRouterComponent } from './breadcrumb-router.component'; import { BreadcrumbRouterService } from './breadcrumb-router.service'; -import { BreadcrumbModule } from '../breadcrumb.module'; describe('BreadcrumbComponent', () => { let component: BreadcrumbRouterComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; - let router: Router; + let harness: RouterTestingHarness; + + const routes: Route[] = [ + { path: 'home', component: BreadcrumbRouterComponent, data: { title: 'Home' } }, + { path: 'color', component: BreadcrumbRouterComponent, title: 'Color' }, + { path: '', component: BreadcrumbRouterComponent } + ]; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ CommonModule, RouterTestingModule.withRoutes([]), BreadcrumbModule ], - declarations: [ BreadcrumbRouterComponent ], - providers: [ BreadcrumbRouterService ], - }) - .compileComponents(); + imports: [BreadcrumbRouterComponent], + providers: [BreadcrumbRouterService, provideRouter(routes)] + }).compileComponents(); })); - beforeEach(() => { + beforeEach(async () => { fixture = TestBed.createComponent(BreadcrumbRouterComponent); - router = TestBed.inject(Router); component = fixture.componentInstance; + componentRef = fixture.componentRef; + + harness = await RouterTestingHarness.create(); fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have breadcrumbs', () => { + expect(component.breadcrumbs).toBeDefined(); + }); + + it('should get breadcrumbs from service', async () => { + const comp = await harness.navigateByUrl('/home'); + component.breadcrumbs?.pipe(take(1)).subscribe((breadcrumbs) => { + expect(breadcrumbs).toEqual([{ label: 'Home', url: '/home', queryParams: {} }]); + }); + }); + it('should get breadcrumbs from service', async () => { + const comp = await harness.navigateByUrl('/color?id=1&test=2'); + component.breadcrumbs?.pipe(take(1)).subscribe((breadcrumbs) => { + expect(breadcrumbs).toEqual([{ label: 'Color', url: '/color', queryParams: { id: '1', test: '2' } }]); + }); + }); + it('should get breadcrumbs from service', async () => { + const comp = await harness.navigateByUrl('/'); + component.breadcrumbs?.pipe(take(1)).subscribe((breadcrumbs) => { + expect(breadcrumbs).toEqual([{ label: '', url: '/', queryParams: {} }]); + }); + }); + + it('should emit breadcrumbs on items change', () => { + componentRef.setInput('items', [{ label: 'test' }]); + fixture.detectChanges(); + component.breadcrumbs?.pipe(take(1)).subscribe((breadcrumbs) => { + expect(breadcrumbs).toEqual([{ label: 'test' }]); + }); + }); }); diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.ts index b2e06bec..c849ccdb 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.ts @@ -1,46 +1,42 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; +import { Component, effect, inject, input, OnDestroy, OnInit } from '@angular/core'; +import { Observable, Observer } from 'rxjs'; +import { AsyncPipe } from '@angular/common'; -import {IBreadcrumbItem} from '../breadcrumb-item/breadcrumb-item'; -import {Observable, Observer} from 'rxjs'; +import { IBreadcrumbItem } from '../breadcrumb-item/breadcrumb-item'; +import { BreadcrumbComponent } from '../breadcrumb/breadcrumb.component'; import { BreadcrumbRouterService } from './breadcrumb-router.service'; +import { BreadcrumbItemComponent } from '../breadcrumb-item/breadcrumb-item.component'; @Component({ selector: 'c-breadcrumb-router, [cBreadcrumbRouter]', templateUrl: './breadcrumb-router.component.html', - styleUrls: ['./breadcrumb-router.component.scss'] + imports: [BreadcrumbComponent, BreadcrumbItemComponent, AsyncPipe] }) -export class BreadcrumbRouterComponent implements OnChanges, OnDestroy, OnInit { +export class BreadcrumbRouterComponent implements OnDestroy, OnInit { + readonly service = inject(BreadcrumbRouterService); + /** * Optional array of IBreadcrumbItem to override default BreadcrumbRouter behavior. [docs] - * @type IBreadcrumbItem[] + * @return IBreadcrumbItem[] */ - @Input() items?: IBreadcrumbItem[]; - + readonly items = input(); public breadcrumbs: Observable | undefined; - constructor( - public service: BreadcrumbRouterService, - ) { } - ngOnInit(): void { this.breadcrumbs = this.service.breadcrumbs$; } - public ngOnChanges(changes: SimpleChanges): void { - if (changes['items']) { - this.setup(); - } - } - - setup(): void { - if (this.items && this.items.length > 0) { + readonly setup = effect(() => { + const items = this.items(); + if (items && items.length > 0) { this.breadcrumbs = new Observable((observer: Observer) => { - if (this.items) { - observer.next(this.items); + const itemsValue = this.items(); + if (itemsValue) { + observer.next(itemsValue); } }); } - } + }); ngOnDestroy(): void { this.breadcrumbs = undefined; diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.spec.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.spec.ts index e06ef5d1..ac32fab6 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.spec.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.spec.ts @@ -1,14 +1,14 @@ import { TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { BreadcrumbRouterService } from './breadcrumb-router.service'; +import { provideRouter } from '@angular/router'; describe('AppBreadcrumbService', () => { let service: BreadcrumbRouterService; beforeEach(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule.withRoutes([])], + providers: [provideRouter([])] }); service = TestBed.inject(BreadcrumbRouterService); }); diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts index 7aea1aec..c9faa199 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts @@ -1,30 +1,33 @@ -import { Injectable } from '@angular/core'; -import { Router, ActivatedRoute, NavigationEnd } from '@angular/router'; +import { inject, Injectable } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { BehaviorSubject, Observable } from 'rxjs'; import { filter } from 'rxjs/operators'; import { IBreadcrumbItem } from '../breadcrumb-item/breadcrumb-item'; @Injectable({ - providedIn: 'root', + providedIn: 'root' }) export class BreadcrumbRouterService { - public outlet = 'primary'; - - breadcrumbs$: Observable; - private breadcrumbsBehaviorSubject: BehaviorSubject; + readonly #router = inject(Router); + readonly #activatedRoute = inject(ActivatedRoute); - constructor(private router: Router, private route: ActivatedRoute) { - this.breadcrumbsBehaviorSubject = new BehaviorSubject( - new Array() - ); + public outlet = 'primary'; - this.breadcrumbs$ = this.breadcrumbsBehaviorSubject.asObservable(); + readonly #breadcrumbsBehaviorSubject: BehaviorSubject = new BehaviorSubject( + new Array() + ); + readonly breadcrumbs$: Observable = this.#breadcrumbsBehaviorSubject.asObservable(); - this.router.events - .pipe(filter((event) => event instanceof NavigationEnd)) + constructor() { + this.#router.events + .pipe( + takeUntilDestroyed(), + filter((event) => event instanceof NavigationEnd) + ) .subscribe((event) => { const breadcrumbs: any[] = []; - let currentRoute: ActivatedRoute | null = this.route.root; + let currentRoute: ActivatedRoute | null = this.#activatedRoute.root; let url = ''; do { const childrenRoutes: ActivatedRoute[] = currentRoute.children; @@ -33,22 +36,19 @@ export class BreadcrumbRouterService { // console.log('breadcrumb event', event, 'route', route); if (childRoute.outlet === this.outlet) { const routeSnapshot = childRoute.snapshot; - url += - '/' + - routeSnapshot.url.map((segment) => segment.path).join('/'); + url += '/' + routeSnapshot.url.map((segment) => segment.path).join('/'); breadcrumbs.push({ - label: childRoute.snapshot.data['title'] || '', + label: routeSnapshot.data['title'] ?? routeSnapshot.title ?? '', url, - queryParams: routeSnapshot.queryParams, + queryParams: routeSnapshot.queryParams }); currentRoute = childRoute; } }); } while (currentRoute); - this.breadcrumbsBehaviorSubject.next(Object.assign([], breadcrumbs)); + this.#breadcrumbsBehaviorSubject.next(Object.assign([], breadcrumbs)); - // console.log('breadcrumbs', breadcrumbs); return breadcrumbs; }); } diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb.module.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb.module.ts index 37530cbd..fb7897b6 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb.module.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb.module.ts @@ -1,26 +1,22 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; // CoreUI Breadcrumb Component import { BreadcrumbComponent } from './breadcrumb/breadcrumb.component'; import { BreadcrumbItemComponent } from './breadcrumb-item/breadcrumb-item.component'; import { BreadcrumbRouterComponent } from './breadcrumb-router/breadcrumb-router.component'; import { BreadcrumbRouterService } from './breadcrumb-router/breadcrumb-router.service'; -import { SharedModule } from '../shared'; @NgModule({ - imports: [CommonModule, RouterModule, SharedModule], - exports: [ + imports: [ BreadcrumbComponent, BreadcrumbItemComponent, - BreadcrumbRouterComponent, + BreadcrumbRouterComponent ], - declarations: [ - BreadcrumbRouterComponent, - BreadcrumbItemComponent, + exports: [ BreadcrumbComponent, + BreadcrumbItemComponent, + BreadcrumbRouterComponent ], - providers: [BreadcrumbRouterService], + providers: [BreadcrumbRouterService] }) -export class BreadcrumbModule { } +export class BreadcrumbModule {} diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.html b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.html deleted file mode 100644 index 9af43669..00000000 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.scss b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.spec.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.spec.ts index 466d7e7d..9dd86e69 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.spec.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.spec.ts @@ -8,9 +8,8 @@ describe('BreadcrumbComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ BreadcrumbComponent ] - }) - .compileComponents(); + imports: [BreadcrumbComponent] + }).compileComponents(); }); beforeEach(() => { @@ -22,4 +21,16 @@ describe('BreadcrumbComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('breadcrumb'); + }); + + it('should have aria-label attribute', () => { + expect(fixture.nativeElement.getAttribute('aria-label')).toBe('breadcrumb'); + }); + + it('should have role attribute', () => { + expect(fixture.nativeElement.getAttribute('role')).toBe('navigation'); + }); }); diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts index 6cd6ee2b..7d4a8412 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts @@ -1,34 +1,26 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, input } from '@angular/core'; @Component({ selector: 'c-breadcrumb', - templateUrl: './breadcrumb.component.html', - styleUrls: ['./breadcrumb.component.scss'] + template: '', + host: { + class: 'breadcrumb', + '[attr.aria-label]': 'ariaLabel()', + '[attr.role]': 'role()' + } }) export class BreadcrumbComponent { /** * Default aria-label for breadcrumb. [docs] - * @type string + * @return string * @default 'breadcrumb' */ - @HostBinding('attr.aria-label') - @Input() ariaLabel = 'breadcrumb'; + readonly ariaLabel = input('breadcrumb'); /** * Default role for breadcrumb. [docs] - * @type string + * @return string * @default 'navigation' */ - @HostBinding('attr.role') - @Input() role = 'navigation'; - - @HostBinding('class') - get hostClasses() { - return { - breadcrumb: true - } - } - - constructor() { } - + readonly role = input('navigation'); } diff --git a/projects/coreui-angular/src/lib/breadcrumb/public_api.ts b/projects/coreui-angular/src/lib/breadcrumb/public_api.ts index f1bc830d..b89fd85e 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/public_api.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/public_api.ts @@ -1,4 +1,4 @@ -export { IBreadcrumbItem } from './breadcrumb-item/breadcrumb-item'; +export type { IBreadcrumbItem } from './breadcrumb-item/breadcrumb-item'; export { BreadcrumbItemComponent } from './breadcrumb-item/breadcrumb-item.component'; export { BreadcrumbComponent } from './breadcrumb/breadcrumb.component'; export { BreadcrumbRouterComponent } from './breadcrumb-router/breadcrumb-router.component'; diff --git a/projects/coreui-angular/src/lib/button-group/button-group.module.ts b/projects/coreui-angular/src/lib/button-group/button-group.module.ts index cf08a10b..9cc982ee 100644 --- a/projects/coreui-angular/src/lib/button-group/button-group.module.ts +++ b/projects/coreui-angular/src/lib/button-group/button-group.module.ts @@ -1,19 +1,9 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { ButtonGroupComponent } from './button-group/button-group.component'; import { ButtonToolbarComponent } from './button-toolbar/button-toolbar.component'; @NgModule({ - declarations: [ - ButtonGroupComponent, - ButtonToolbarComponent - ], - imports: [ - CommonModule - ], - exports: [ - ButtonGroupComponent, - ButtonToolbarComponent - ] + imports: [ButtonGroupComponent, ButtonToolbarComponent], + exports: [ButtonGroupComponent, ButtonToolbarComponent] }) -export class ButtonGroupModule { } +export class ButtonGroupModule {} diff --git a/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.spec.ts b/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.spec.ts index 78a07eab..c57b9233 100644 --- a/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.spec.ts +++ b/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.spec.ts @@ -8,9 +8,9 @@ describe('ButtonGroupComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ButtonGroupComponent ] + imports: [ButtonGroupComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ButtonGroupComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('btn-group'); + }); }); diff --git a/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts b/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts index 0940c777..4425bf45 100644 --- a/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts +++ b/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts @@ -1,39 +1,35 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { booleanAttribute, Component, computed, input, InputSignal, InputSignalWithTransform } from '@angular/core'; @Component({ selector: 'c-button-group', - template: ``, + template: '', + host: { '[attr.role]': 'role()', '[class]': 'hostClasses()' } }) export class ButtonGroupComponent { - /** * Size the component small or large. * @type { 'sm' | 'lg' } */ - @Input() size?: 'sm' | 'lg'; + readonly size: InputSignal<'sm' | 'lg' | undefined> = input(); + /** * Create a set of buttons that appear vertically stacked rather than horizontally. Split button dropdowns are not supported here. * @type boolean */ - @Input() vertical?: boolean; + readonly vertical: InputSignalWithTransform = input(false, { transform: booleanAttribute }); + /** * Default role attr for ButtonGroup. [docs] - * @type string + * @type InputSignal * @default 'group' */ - @HostBinding('attr.role') - @Input() role = 'group'; + readonly role: InputSignal = input('group'); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { - 'btn-group': !this.vertical, - 'btn-group-vertical': this.vertical, - [`btn-group-${this.size}`]: !!this.size, - }; - } - - - constructor() { } - + 'btn-group': !this.vertical(), + 'btn-group-vertical': this.vertical(), + [`btn-group-${this.size()}`]: !!this.size() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.spec.ts b/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.spec.ts index 4d363a0a..09283fc0 100644 --- a/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.spec.ts +++ b/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.spec.ts @@ -8,9 +8,9 @@ describe('ButtonToolbarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ButtonToolbarComponent ] + imports: [ButtonToolbarComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ButtonToolbarComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('btn-toolbar'); + }); }); diff --git a/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts b/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts index e0b11e30..d0659f35 100644 --- a/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts +++ b/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts @@ -1,25 +1,15 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, input, InputSignal } from '@angular/core'; @Component({ selector: 'c-button-toolbar', - template: ``, + template: '', + host: { class: 'btn-toolbar', '[attr.role]': 'role()' } }) export class ButtonToolbarComponent { /** * Default role attr for ButtonToolbar. [docs] - * @type string + * @type InputSignal * @default 'toolbar' */ - @HostBinding('attr.role') - @Input() role = 'toolbar'; - - @HostBinding('class') - get hostClasses(): any { - return { - 'btn-toolbar': true, - }; - } - - constructor() { } - + role: InputSignal = input('toolbar'); } diff --git a/projects/coreui-angular/src/lib/button/button-close.directive.spec.ts b/projects/coreui-angular/src/lib/button/button-close.directive.spec.ts index d9c5ca1b..ddcc5691 100644 --- a/projects/coreui-angular/src/lib/button/button-close.directive.spec.ts +++ b/projects/coreui-angular/src/lib/button/button-close.directive.spec.ts @@ -1,36 +1,43 @@ -import { ButtonCloseDirective } from './button-close.directive'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; import { Component, DebugElement, ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; +import { ButtonCloseDirective } from './button-close.directive'; class MockElementRef extends ElementRef {} @Component({ - template: `` + template: '', + imports: [ButtonCloseDirective] }) -class TestComponent { } +class TestComponent {} describe('ButtonCloseDirective', () => { - let component: TestComponent; let fixture: ComponentFixture; - let buttonEl: DebugElement; + let elementRef: DebugElement; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [ButtonCloseDirective, TestComponent], + imports: [TestComponent, ButtonCloseDirective], providers: [{ provide: ElementRef, useClass: MockElementRef }] - }) + }); fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; - buttonEl = fixture.debugElement.query(By.css('button')); + elementRef = fixture.debugElement.query(By.directive(ButtonCloseDirective)); fixture.detectChanges(); // initial binding - }) + }); it('should create an instance', () => { - const directive = new ButtonCloseDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ButtonCloseDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(elementRef.nativeElement).toHaveClass('btn'); + expect(elementRef.nativeElement).toHaveClass('btn-close'); }); }); diff --git a/projects/coreui-angular/src/lib/button/button-close.directive.ts b/projects/coreui-angular/src/lib/button/button-close.directive.ts index 1b17a268..6ebfe196 100644 --- a/projects/coreui-angular/src/lib/button/button-close.directive.ts +++ b/projects/coreui-angular/src/lib/button/button-close.directive.ts @@ -1,35 +1,36 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, computed, Directive, input, InputSignalWithTransform } from '@angular/core'; +import { ThemeDirective } from '../shared/theme.directive'; import { ButtonDirective } from './button.directive'; @Directive({ - selector: '[cButtonClose]' + selector: '[cButtonClose]', + hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }], + host: { + class: 'btn btn-close', + '[class]': 'hostClasses()', + '[attr.aria-disabled]': 'ariaDisabled()', + '[attr.aria-pressed]': 'isActive()', + '[attr.disabled]': 'attrDisabled()', + '[attr.tabindex]': 'tabIndex()', + '[attr.type]': 'type()' + } }) export class ButtonCloseDirective extends ButtonDirective { - - static ngAcceptInputType_white: BooleanInput; - private _white = false; /** * Change the default color to white. * @type boolean + * @deprecated 5.0.0. Use `cButtonClose.dark` instead. */ - @Input() - get white(): boolean { - return this._white; - } - set white(value: boolean) { - this._white = coerceBooleanProperty(value); - } + readonly white: InputSignalWithTransform = input(false, { transform: booleanAttribute }); - @HostBinding('class') - override get hostClasses(): any { + override readonly hostClasses = computed(() => { return { btn: true, 'btn-close': true, - 'btn-close-white': this.white, - [`btn-${this.size}`]: !!this.size, - disabled: this.disabled, - active: this.active, - }; - } + 'btn-close-white': this.white(), + [`btn-${this.size()}`]: !!this.size(), + active: this.active(), + disabled: this._disabled() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/button/button.directive.spec.ts b/projects/coreui-angular/src/lib/button/button.directive.spec.ts index 2fd7844e..b9ea20ea 100644 --- a/projects/coreui-angular/src/lib/button/button.directive.spec.ts +++ b/projects/coreui-angular/src/lib/button/button.directive.spec.ts @@ -1,38 +1,44 @@ import { ButtonDirective } from './button.directive'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ButtonCloseDirective } from './button-close.directive'; import { Component, DebugElement, ElementRef } from '@angular/core'; import { By } from '@angular/platform-browser'; class MockElementRef extends ElementRef {} @Component({ - template: `` + template: '', + imports: [ButtonDirective] }) -class TestComponent { } +class TestComponent {} describe('ButtonDirective', () => { - let component: TestComponent; let fixture: ComponentFixture; - let buttonEl: DebugElement; + let elementRef: DebugElement; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [ButtonCloseDirective, TestComponent], + imports: [TestComponent, ButtonDirective], providers: [{ provide: ElementRef, useClass: MockElementRef }] - }) + }); fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; - buttonEl = fixture.debugElement.query(By.css('button')); + elementRef = fixture.debugElement.query(By.directive(ButtonDirective)); fixture.detectChanges(); // initial binding - }) - + }); it('should create an instance', () => { - const directive = new ButtonDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ButtonDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(elementRef.nativeElement).toHaveClass('btn'); + expect(elementRef.nativeElement).toHaveClass('btn-lg'); + expect(elementRef.nativeElement).toHaveClass('btn-info'); }); }); diff --git a/projects/coreui-angular/src/lib/button/button.directive.ts b/projects/coreui-angular/src/lib/button/button.directive.ts index 3cfbb31c..30bae81c 100644 --- a/projects/coreui-angular/src/lib/button/button.directive.ts +++ b/projects/coreui-angular/src/lib/button/button.directive.ts @@ -1,102 +1,93 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion'; +import { booleanAttribute, computed, Directive, input, InputSignal, InputSignalWithTransform } from '@angular/core'; import { ButtonType, Colors, Shapes } from '../coreui.types'; @Directive({ selector: '[cButton]', - exportAs: 'cButton' + exportAs: 'cButton', + host: { + class: 'btn', + '[class]': 'hostClasses()', + '[attr.aria-disabled]': 'ariaDisabled()', + '[attr.aria-pressed]': 'isActive()', + '[attr.disabled]': 'attrDisabled()', + '[attr.tabindex]': 'tabIndex()', + '[attr.type]': 'type()' + } }) export class ButtonDirective { - - constructor() {} - - static ngAcceptInputType_active: BooleanInput; - private _active = false; - static ngAcceptInputType_disabled: BooleanInput; - private _disabled = false; - /** * Toggle the active state for the component. [docs] - * @type boolean + * @type InputSignalWithTransform */ - @Input() - get active(): boolean { - return this._active; - } - set active(value: boolean) { - this._active = coerceBooleanProperty(value); - } + readonly active: InputSignalWithTransform = input(false, { transform: booleanAttribute }); /** * Sets the color context of the component to one of CoreUI’s themed colors. [docs] - * @type Colors + * @type InputSignal */ - @Input() color?: Colors = 'primary'; + readonly color: InputSignal = input('primary'); + /** * Toggle the disabled state for the component. - * @type boolean + * @type InputSignalWithTransform */ - @Input() - get disabled(): boolean { - return this._disabled; - } - set disabled(value: boolean) { - this._disabled = coerceBooleanProperty(value); - } + readonly disabled: InputSignalWithTransform = input(false, { transform: booleanAttribute }); + /** * Select the shape of the component. - * @type { 'rounded' | 'rounded-top' | 'rounded-end' | 'rounded-bottom' | 'rounded-start' | 'rounded-circle' | 'rounded-pill' | 'rounded-0' | 'rounded-1' | 'rounded-2' | 'rounded-3' | string } + * @type InputSignal */ - @Input() shape?: Shapes; + readonly shape: InputSignal = input(); + /** * Size the component small or large. - * @type {'sm' | 'lg'} + * @type InputSignal<'sm' | 'lg' | ''> */ - @Input() size?: 'sm' | 'lg' | '' = ''; + readonly size: InputSignal<'' | 'sm' | 'lg'> = input<'' | 'sm' | 'lg'>(''); + /** * Specifies the type of button. Always specify the type attribute for the ` - -
+@let tmpl = templates(); + + + + @for (item of items; track item; let i = $index) { + + } + diff --git a/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.scss b/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.spec.ts b/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.spec.ts index 7a164a53..2a6b876e 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.spec.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.spec.ts @@ -12,21 +12,32 @@ describe('CarouselIndicatorsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ CarouselIndicatorsComponent ], - providers: [ CarouselService, CarouselState ] - }) - .compileComponents(); + imports: [CarouselIndicatorsComponent], + providers: [CarouselService, CarouselState] + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(CarouselIndicatorsComponent); service = TestBed.inject(CarouselService); state = TestBed.inject(CarouselState); + state.setItems([]); component = fixture.componentInstance; + component.items = [0, 1, 2, 3]; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should set active index', () => { + service.setIndex({ active: 1 }); + expect(component.active).toBe(1); + }); + + it('should call onClick', () => { + component.onClick(2); + expect(component.active).toBe(2); + }); }); diff --git a/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.ts b/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.ts index 4dd8eae7..a50f4962 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.ts @@ -1,49 +1,51 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Subscription } from 'rxjs'; +import { Component, computed, contentChildren, DestroyRef, inject, OnInit, TemplateRef } from '@angular/core'; + import { CarouselState } from '../carousel-state'; import { CarouselService } from '../carousel.service'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { NgTemplateOutlet } from '@angular/common'; +import { TemplateIdDirective } from '../../shared'; @Component({ selector: 'c-carousel-indicators', + exportAs: 'cCarouselIndicators', + imports: [NgTemplateOutlet], templateUrl: './carousel-indicators.component.html', - styleUrls: ['./carousel-indicators.component.scss'], + host: { class: 'carousel-indicators' } }) -export class CarouselIndicatorsComponent implements OnInit, OnDestroy { +export class CarouselIndicatorsComponent implements OnInit { + readonly #destroyRef = inject(DestroyRef); + readonly #carouselService = inject(CarouselService); + readonly #carouselState = inject(CarouselState); + items: (number | undefined)[] = []; active = 0; - private carouselIndexSubscription?: Subscription; + readonly contentTemplates = contentChildren(TemplateIdDirective, { descendants: true }); - constructor( - private carouselService: CarouselService, - private carouselState: CarouselState - ) {} + readonly templates = computed(() => { + return this.contentTemplates().reduce( + (acc, child) => { + acc[child.id] = child.templateRef; + return acc; + }, + {} as Record> + ); + }); ngOnInit(): void { - this.carouselStateSubscribe(); - } - - ngOnDestroy(): void { - this.carouselStateSubscribe(false); + this.#carouselService.carouselIndex$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((nextIndex) => { + this.items = this.#carouselState?.state?.items?.map((item) => item.index) ?? []; + if ('active' in nextIndex) { + this.active = nextIndex.active ?? 0; + } + }); } onClick(index: number): void { if (index !== this.active) { const direction = index < this.active ? 'prev' : 'next'; - this.carouselState.state = { direction, activeItemIndex: index }; - } - } - - private carouselStateSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.carouselIndexSubscription = this.carouselService.carouselIndex$.subscribe((nextIndex) => { - this.items = this.carouselState?.state?.items?.map(item => item.index) ?? []; - if ('active' in nextIndex) { - this.active = nextIndex.active ?? 0; - } - }); - } else { - this.carouselIndexSubscription?.unsubscribe(); + this.#carouselState.state = { direction, activeItemIndex: index }; } } } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.html b/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.html deleted file mode 100644 index 7ded7181..00000000 --- a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
- -
- - - - diff --git a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.spec.ts b/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.spec.ts index 9e351a0c..4b624e5d 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.spec.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.spec.ts @@ -8,16 +8,15 @@ import { CarouselState } from '../carousel-state'; describe('CarouselInnerComponent', () => { let component: CarouselInnerComponent; let fixture: ComponentFixture; - let service: CarouselService - let state: CarouselState + let service: CarouselService; + let state: CarouselState; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ CarouselInnerComponent ], - providers: [ CarouselService, CarouselState ], - imports: [NoopAnimationsModule], + providers: [CarouselService, CarouselState], + imports: [NoopAnimationsModule, CarouselInnerComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -31,4 +30,8 @@ describe('CarouselInnerComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('carousel-inner'); + }); }); diff --git a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.ts b/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.ts index 6ed610c7..838b27ee 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.ts @@ -2,33 +2,46 @@ import { AfterContentChecked, AfterContentInit, Component, - ContentChildren, - HostBinding, - OnInit, - QueryList, + computed, + contentChildren, + inject, + signal } from '@angular/core'; - -import { slideAnimation, fadeAnimation } from '../carousel.animation'; import { CarouselItemComponent } from '../carousel-item/carousel-item.component'; import { CarouselState } from '../carousel-state'; +import { carouselPlay } from '../carousel.animation'; @Component({ selector: 'c-carousel-inner', - templateUrl: './carousel-inner.component.html', styleUrls: ['./carousel-inner.component.scss'], - animations: [ slideAnimation, fadeAnimation ] + animations: [carouselPlay], + template: '', + host: { + class: 'carousel-inner', + '[@carouselPlay]': 'slideType()', + '[@.disabled]': '!animate()', + '[attr.aria-live]': 'ariaLive()' + } }) export class CarouselInnerComponent implements AfterContentInit, AfterContentChecked { - @HostBinding('class.carousel-inner') carouselInnerClass = true; + readonly #carouselState = inject(CarouselState); + + readonly activeIndex = signal(undefined); + readonly animate = signal(true); + readonly interval = signal(0); + readonly slide = signal({ left: true }); + readonly transition = signal('crossfade'); + + readonly slideType = computed(() => { + return { left: this.slide().left, type: this.transition() }; + }); - @ContentChildren(CarouselItemComponent) private contentItems!: QueryList; - private prevContentItems!: QueryList; - activeIndex?: number; - animate?: boolean; - slide = {left: true}; - transition = 'slide'; + readonly ariaLive = computed(() => { + return this.interval() ? 'off' : 'polite'; + }); - constructor(private carouselState: CarouselState) {} + readonly contentItems = contentChildren(CarouselItemComponent); + readonly #prevContentItems = signal([]); ngAfterContentInit(): void { this.setItems(); @@ -36,21 +49,23 @@ export class CarouselInnerComponent implements AfterContentInit, AfterContentChe ngAfterContentChecked(): void { this.setItems(); - const state = this.carouselState?.state; + const state = this.#carouselState?.state; const nextIndex = state?.activeItemIndex; const nextDirection = state?.direction; - if (this.activeIndex !== nextIndex) { - this.animate = state?.animate; - this.slide = {left: nextDirection === 'next'}; - this.activeIndex = state?.activeItemIndex; - this.transition = state?.transition ?? 'slide'; + if (this.activeIndex() !== nextIndex) { + this.animate.set(state?.animate ?? false); + this.activeIndex.set(state?.activeItemIndex); + this.interval.set(state?.interval ?? 0); + this.slide.set({ left: nextDirection === 'next' }); + this.transition.set(state?.transition ?? 'slide'); } } setItems(): void { - if (this.prevContentItems !== this.contentItems) { - this.prevContentItems = this.contentItems; - this.carouselState.setItems(this.contentItems); + const contentItems = this.contentItems(); + if (this.#prevContentItems() !== contentItems) { + this.#prevContentItems.set([...contentItems]); + this.#carouselState.setItems(contentItems); } } } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html index 3b2ae519..961fa2af 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html +++ b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html @@ -1 +1,3 @@ - +@if (active()) { + +} diff --git a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.scss b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.scss index 8f7a46d4..5d4e87f3 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.scss +++ b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.scss @@ -1,4 +1,3 @@ :host { display: block; - //display: block !important; } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.spec.ts b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.spec.ts index 50400794..6b3e8faa 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.spec.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.spec.ts @@ -6,14 +6,14 @@ import { CarouselService } from '../carousel.service'; describe('CarouselItemComponent', () => { let component: CarouselItemComponent; let fixture: ComponentFixture; - let service: CarouselService + let service: CarouselService; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ CarouselItemComponent ], - providers: [ CarouselService ] + imports: [CarouselItemComponent], + providers: [CarouselService] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -26,4 +26,8 @@ describe('CarouselItemComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('carousel-item'); + }); }); diff --git a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts index 0836578d..909eef35 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts @@ -1,74 +1,56 @@ -import { AfterViewInit, ChangeDetectorRef, Component, HostBinding, Input, OnDestroy } from '@angular/core'; - -import { Subscription } from 'rxjs'; +import { booleanAttribute, Component, DestroyRef, inject, input, linkedSignal } from '@angular/core'; import { CarouselService } from '../carousel.service'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ selector: 'c-carousel-item', templateUrl: './carousel-item.component.html', - styleUrls: ['./carousel-item.component.scss'] + styleUrls: ['./carousel-item.component.scss'], + exportAs: 'cCarouselItem', + host: { + class: 'carousel-item', + '[class.active]': 'active()', + '[attr.role]': 'role()' + } }) -export class CarouselItemComponent implements OnDestroy, AfterViewInit { - - static ngAcceptInputType_active: BooleanInput; +export class CarouselItemComponent { + readonly #destroyRef = inject(DestroyRef); + readonly #carouselService = inject(CarouselService); index?: number; - private carouselIndexSubscription?: Subscription; /** * @ignore */ - @Input() - set active(value) { - this._active = coerceBooleanProperty(value); - this.changeDetectorRef.markForCheck(); - } - get active(): boolean { - return this._active; - } - private _active = false; + readonly activeInput = input(false, { transform: booleanAttribute, alias: 'active' }); + + readonly active = linkedSignal({ + source: this.activeInput, + computation: (value) => { + return value; + } + }); /** * Time delay before cycling to next item. If -1, uses carousel interval value. - * @type number + * @return number * @default -1 */ - @Input() interval: number = -1; - - @HostBinding('class') - get hostClasses(): any { - return { - 'carousel-item': true, - active: this.active - }; - } - - constructor( - private carouselService: CarouselService, - private changeDetectorRef: ChangeDetectorRef - ) {} + readonly interval = input(-1); - ngOnDestroy(): void { - this.carouselStateSubscribe(false); - } + /** + * Carousel item role. + * @return string + * @default 'group' + */ + readonly role = input('group'); - ngAfterViewInit(): void { - setTimeout(() => { - this.carouselStateSubscribe(); + constructor() { + this.#carouselService.carouselIndex$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((nextIndex) => { + if ('active' in nextIndex) { + this.active.set(nextIndex.active === this.index); + } }); } - - private carouselStateSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.carouselIndexSubscription = this.carouselService.carouselIndex$.subscribe((nextIndex) => { - if ('active' in nextIndex) { - this.active = nextIndex.active === this.index; - } - }); - } else { - this.carouselIndexSubscription?.unsubscribe(); - } - } } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-state.ts b/projects/coreui-angular/src/lib/carousel/carousel-state.ts index 973c6eed..99f84859 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-state.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-state.ts @@ -1,32 +1,33 @@ -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { ICarouselState } from './carousel-state.type'; import { CarouselService } from './carousel.service'; import { CarouselItemComponent } from './carousel-item/carousel-item.component'; @Injectable() export class CarouselState { - private _state: ICarouselState = { + readonly #carouselService = inject(CarouselService); + + #state = { activeItemIndex: -1, animate: true, items: [], direction: 'next', - transition: 'slide' + transition: 'slide', + interval: 0 }; - constructor(private carouselService: CarouselService) {} - get state(): ICarouselState { - return this._state; + return this.#state; } set state(state) { - const prevState = { ...this._state }; - const nextState = { ...this._state, ...state }; - this._state = nextState; + const prevState = { ...this.#state }; + const nextState = { ...this.#state, ...state }; + this.#state = nextState; if (prevState.activeItemIndex !== nextState.activeItemIndex) { const activeItemIndex = this.state.activeItemIndex || 0; - const itemInterval = this.state.items && this.state.items[activeItemIndex]?.interval || -1; - this.carouselService.setIndex({ + const itemInterval = (this.state.items && this.state.items[activeItemIndex]?.interval()) || -1; + this.#carouselService.setIndex({ active: nextState.activeItemIndex, interval: itemInterval, lastItemIndex: (nextState.items?.length ?? 0) - 1 @@ -36,12 +37,12 @@ export class CarouselState { setItems(newItems: any): void { if (newItems.length) { - const itemsArray = newItems.toArray(); + const itemsArray = newItems; itemsArray.forEach((item: CarouselItemComponent, i: number) => { item.index = i; }); this.state = { - items: itemsArray + items: [...itemsArray] }; } else { this.reset(); @@ -49,7 +50,7 @@ export class CarouselState { } setNextIndex(nextIndex: any): void { - this.carouselService.setIndex(nextIndex); + this.#carouselService.setIndex(nextIndex); } direction(direction: 'next' | 'prev' = 'next'): number { @@ -57,9 +58,13 @@ export class CarouselState { const { activeItemIndex = -1, items } = this.state; const itemsCount = items?.length ?? 0; if (itemsCount > 0) { - return direction === 'next' ? - (activeItemIndex === itemsCount - 1 ? 0 : activeItemIndex + 1) : - (activeItemIndex === 0 ? itemsCount - 1 : activeItemIndex - 1); + return direction === 'next' + ? activeItemIndex === itemsCount - 1 + ? 0 + : activeItemIndex + 1 + : activeItemIndex === 0 + ? itemsCount - 1 + : activeItemIndex - 1; } else { return 0; } @@ -71,7 +76,8 @@ export class CarouselState { animate: true, items: [], direction: 'next', - transition: 'slide' + transition: 'slide', + interval: 0 }; } } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-state.type.ts b/projects/coreui-angular/src/lib/carousel/carousel-state.type.ts index 6b549ddb..cfc2660d 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-state.type.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-state.type.ts @@ -1,17 +1,18 @@ import { CarouselItemComponent } from './carousel-item/carousel-item.component'; export interface ICarouselOptions { - interval?: number; - animate?: boolean; activeIndex?: number; + animate?: boolean; direction?: 'next' | 'prev'; + interval?: number; transition?: 'slide' | 'crossfade'; } export interface ICarouselState { activeItemIndex?: number; animate?: boolean; - items?: CarouselItemComponent[]; direction?: 'next' | 'prev'; + interval?: number; + items?: CarouselItemComponent[]; transition?: 'slide' | 'crossfade'; } diff --git a/projects/coreui-angular/src/lib/carousel/carousel.animation.ts b/projects/coreui-angular/src/lib/carousel/carousel.animation.ts index 85592a4b..18d7b6d8 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel.animation.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel.animation.ts @@ -1,142 +1,136 @@ -import { - animate, - group, - query, - state, - style, - transition, - trigger, -} from '@angular/animations'; +import { animate, animation, group, query, state, style, transition, trigger, useAnimation } from '@angular/animations'; -export function toLeft(fromState: any, toState: any): boolean { - return toState.left === true; +export function toSlideLeft(fromState: any, toState: any): boolean { + return toState.left === true && toState.type === 'slide'; } -export function toRight(fromState: any, toState: any): boolean { - return toState.left === false; + +export function toSlideRight(fromState: any, toState: any): boolean { + return toState.left === false && toState.type === 'slide'; +} + +export function toFadeLeft(fromState: any, toState: any): boolean { + return toState.left === true && toState.type !== 'slide'; +} + +export function toFadeRight(fromState: any, toState: any): boolean { + return toState.left === false && toState.type !== 'slide'; } -export const slideAnimation = trigger('slideAnimation', [ - state( - '*', - style({ transform: 'translateX(0)', display: 'block', opacity: 1 }) - ), - transition( - toLeft, - group([ - query( - ':leave', - [ - animate( - '0.6s ease-in-out', - style({ - transform: 'translateX(-100%)', - }) - ), - ], - { optional: true } - ), - query( - ':enter', - [ +export const slideAnimationLeft = animation( + group([ + query( + ':leave', + [ + animate( + '0.6s ease-in-out', style({ - transform: 'translateX(100%)', - }), - animate('0.6s ease-in-out', style('*')), - ], - { optional: true } - ), - ]) - ), - transition( - toRight, - group([ - query( - ':enter', - [ + transform: 'translateX(-100%)' + }) + ) + ], + { optional: true } + ), + query( + ':enter', + [ + style({ + transform: 'translateX(100%)' + }), + animate('0.6s ease-in-out', style('*')) + ], + { optional: true } + ) + ]) +); + +export const slideAnimationRight = animation( + group([ + query( + ':enter', + [ + style({ + transform: 'translateX(-100%)' + }), + animate('0.6s ease-in-out', style('*')) + ], + { optional: true } + ), + query( + ':leave', + [ + animate( + '0.6s ease-in-out', style({ - transform: 'translateX(-100%)', - }), - animate('0.6s ease-in-out', style('*')), - ], - { optional: true } - ), - query( - ':leave', - [ - animate( - '0.6s ease-in-out', - style({ - transform: 'translateX(100%)', - }) - ), - ], - { optional: true } - ), - ]) - ), -]); + transform: 'translateX(100%)' + }) + ) + ], + { optional: true } + ) + ]) +); -export const fadeAnimation = trigger('fadeAnimation', [ - state( - '*', - style({ zIndex: 1, opacity: 1 }) - ), - transition( - toLeft, - group([ - query( - ':leave', - [ - animate( - '0.6s ease-in-out', - style({ - zIndex: 0, - opacity: 0, - }) - ), - ], - { optional: true } - ), - query( - ':enter', - [ +export const fadeAnimationLeft = animation( + group([ + query( + ':leave', + [ + animate( + '0.9s ease-in-out', style({ - zIndex: 1, - opacity: 1 - }), - animate('0.6s ease-in-out', style('*')), - ], - { optional: true } - ), - ]) - ), - transition( - toRight, - group([ - query( - ':enter', - [ + zIndex: 0, + opacity: 0 + }) + ) + ], + { optional: true } + ), + query( + ':enter', + [ + style({ + zIndex: 1, + opacity: 1 + }), + animate('0.6s ease-in-out', style('*')) + ], + { optional: true } + ) + ]) +); +export const fadeAnimationRight = animation( + group([ + query( + ':enter', + [ + style({ + zIndex: 1, + opacity: 1 + }), + animate('0.6s ease-in-out', style('*')) + ], + { optional: true } + ), + query( + ':leave', + [ + animate( + '0.9s ease-in-out', style({ - zIndex: 1, - opacity: 1 - }), - animate('0.6s ease-in-out', style('*')), - ], - { optional: true } - ), - query( - ':leave', - [ - animate( - '0.6s ease-in-out', - style({ - zIndex: 0, - opacity: 0, - }) - ), - ], - { optional: true } - ), - ]) - ), + zIndex: 0, + opacity: 0 + }) + ) + ], + { optional: true } + ) + ]) +); + +export const carouselPlay = trigger('carouselPlay', [ + state('*', style({ transform: 'translateX(0)', display: 'block', opacity: 1 })), + transition(toFadeLeft, useAnimation(fadeAnimationLeft)), + transition(toFadeRight, useAnimation(fadeAnimationRight)), + transition(toSlideLeft, useAnimation(slideAnimationLeft)), + transition(toSlideRight, useAnimation(slideAnimationRight)) ]); diff --git a/projects/coreui-angular/src/lib/carousel/carousel.config.ts b/projects/coreui-angular/src/lib/carousel/carousel.config.ts index 54dee000..140d4bb0 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel.config.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel.config.ts @@ -1,15 +1,13 @@ import { Injectable } from '@angular/core'; -@Injectable() +@Injectable({ providedIn: 'root' }) export class CarouselConfig { /* Animate transition of slides */ activeIndex = 0; /* Animate transition of slides */ animate = true; - /* Darken controls, indicators, and captions */ - dark? = false; /* Default direction of auto changing of slides */ direction: 'next' | 'prev' = 'next'; /* Default interval of auto changing of slides */ - interval = 3000; + interval = 0; } diff --git a/projects/coreui-angular/src/lib/carousel/carousel.module.ts b/projects/coreui-angular/src/lib/carousel/carousel.module.ts index eb716f34..7ebb1046 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel.module.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel.module.ts @@ -1,5 +1,4 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { CarouselComponent } from './carousel/carousel.component'; import { CarouselCaptionComponent } from './carousel-caption/carousel-caption.component'; @@ -12,15 +11,14 @@ import { CarouselState } from './carousel-state'; import { CarouselConfig } from './carousel.config'; @NgModule({ - declarations: [ + imports: [ CarouselComponent, CarouselCaptionComponent, CarouselControlComponent, CarouselIndicatorsComponent, CarouselInnerComponent, - CarouselItemComponent, + CarouselItemComponent ], - imports: [CommonModule], providers: [CarouselService, CarouselState, CarouselConfig], exports: [ CarouselComponent, @@ -28,8 +26,8 @@ import { CarouselConfig } from './carousel.config'; CarouselControlComponent, CarouselIndicatorsComponent, CarouselInnerComponent, - CarouselItemComponent, - ], + CarouselItemComponent + ] }) export class CarouselModule { static forRoot(): ModuleWithProviders { diff --git a/projects/coreui-angular/src/lib/carousel/carousel.service.ts b/projects/coreui-angular/src/lib/carousel/carousel.service.ts index 74eee7a7..e2aa043d 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel.service.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel.service.ts @@ -9,12 +9,10 @@ export interface ICarouselIndex { @Injectable() export class CarouselService { - private carouselIndex = new BehaviorSubject({}); - carouselIndex$ = this.carouselIndex.asObservable(); - - constructor() {} + readonly #carouselIndex = new BehaviorSubject({}); + readonly carouselIndex$ = this.#carouselIndex.asObservable(); setIndex(index: ICarouselIndex): void { - this.carouselIndex.next(index); + this.#carouselIndex.next(index); } } diff --git a/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.spec.ts b/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.spec.ts index 69fb301a..56623ebc 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.spec.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.spec.ts @@ -1,20 +1,26 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed, waitForAsync } from '@angular/core/testing'; import { CarouselComponent } from './carousel.component'; +import { CarouselService } from '../carousel.service'; describe('CarouselComponent', () => { let component: CarouselComponent; let fixture: ComponentFixture; + let service: CarouselService; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ CarouselComponent ] - }) - .compileComponents(); + imports: [CarouselComponent] + }).compileComponents(); })); beforeEach(() => { + TestBed.configureTestingModule({ + imports: [CarouselComponent], + providers: [CarouselService] + }).compileComponents(); fixture = TestBed.createComponent(CarouselComponent); + service = TestBed.inject(CarouselService); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -22,4 +28,28 @@ describe('CarouselComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('carousel'); + expect(fixture.nativeElement).toHaveClass('slide'); + fixture.componentRef.setInput('transition', 'crossfade'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('carousel-fade'); + }); + + it('should have default values', () => { + expect(component.activeIndex()).toBe(0); + expect(component.animate()).toBe(true); + expect(component.direction()).toBe('next'); + expect(component.interval()).toBe(0); + }); + + it('should call timer functions', fakeAsync(() => { + const spySet = spyOn(component, 'setTimer'); + const spyReset = spyOn(component, 'resetTimer'); + fixture.nativeElement.dispatchEvent(new Event('mouseenter')); + fixture.nativeElement.dispatchEvent(new Event('mouseleave')); + expect(spySet).toHaveBeenCalled(); + expect(spyReset).toHaveBeenCalled(); + })); }); diff --git a/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts b/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts index ed713565..e0b9a1c2 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts @@ -1,137 +1,174 @@ import { AfterContentInit, Component, + DestroyRef, + effect, ElementRef, - EventEmitter, - HostBinding, Inject, - Input, + inject, + input, + linkedSignal, OnDestroy, OnInit, - Output + output } from '@angular/core'; -import { fromEvent, Subscription, withLatestFrom, zipWith } from 'rxjs'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { fromEvent, Subscription } from 'rxjs'; +import { filter, finalize, withLatestFrom, zipWith } from 'rxjs/operators'; -import { IntersectionService } from '../../services/intersection.service'; -import { IListenersConfig, ListenersService } from '../../services/listeners.service'; +import { IListenersConfig, IntersectionService, ListenersService } from '../../services'; +import { Triggers } from '../../coreui.types'; +import { ThemeDirective } from '../../shared/theme.directive'; import { CarouselState } from '../carousel-state'; import { CarouselService } from '../carousel.service'; import { CarouselConfig } from '../carousel.config'; -import { Triggers } from '../../coreui.types'; @Component({ selector: 'c-carousel', - template: '', + template: '', styleUrls: ['./carousel.component.scss'], - providers: [CarouselService, CarouselState, CarouselConfig, IntersectionService, ListenersService] + providers: [CarouselService, CarouselState, ListenersService], + hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }], + exportAs: 'cCarousel', + host: { + class: 'carousel slide', + '[class.carousel-fade]': 'transition() === "crossfade" && animate()' + } }) export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { + readonly #hostElement = inject(ElementRef); + readonly #carouselService = inject(CarouselService); + readonly #carouselState = inject(CarouselState); + readonly #intersectionService = inject(IntersectionService); + readonly #listenersService = inject(ListenersService); + + constructor(@Inject(CarouselConfig) private config: CarouselConfig) { + this.loadConfig(); + } + + loadConfig() { + this.activeIndex.set(this.config?.activeIndex ?? this.activeIndex()); + this.animate.set(this.config?.animate ?? this.animate()); + this.direction.set(this.config?.direction ?? this.direction()); + this.interval.set(this.config?.interval ?? this.interval()); + } + /** * Index of the active item. - * @type number + * @return number */ - @Input() activeIndex = 0; + readonly activeIndexInput = input(0, { alias: 'activeIndex' }); + + readonly activeIndex = linkedSignal({ + source: this.activeIndexInput, + computation: (value: number) => value + }); + /** * Carousel automatically starts cycle items. - * @type boolean - */ - @Input() animate = true; - /** - * Add darker controls, indicators, and captions. - * @type boolean + * @return boolean */ - @Input() dark?: boolean; + readonly animateInput = input(true, { alias: 'animate' }); + + readonly animate = linkedSignal({ + source: this.animateInput, + computation: (value: boolean) => value + }); + /** * Carousel direction. [docs] - * @type {'next' | 'prev'} + * @return {'next' | 'prev'} */ - @Input() direction: 'next' | 'prev' = 'next'; + readonly directionInput = input<'next' | 'prev'>('next', { alias: 'direction' }); + + readonly direction = linkedSignal({ + source: this.directionInput, + computation: (value: 'next' | 'prev') => value + }); + /** * The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle. - * @type number + * @return number * @default 0 */ - @Input() interval = 0; + readonly intervalInput = input(0, { alias: 'interval' }); + + readonly interval = linkedSignal({ + source: this.intervalInput, + computation: (value: number) => value + }); + + readonly #intervalEffect = effect(() => { + const interval = this.interval(); + this.#carouselState.state = { interval: interval }; + interval ? this.setTimer() : this.resetTimer(); + }); + /** * Sets which event handlers you’d like provided to your pause prop. You can specify one trigger or an array of them. - * @type {'hover' | 'focus' | 'click'} + * @return {'hover' | 'focus' | 'click'} */ - @Input() pause: Triggers | Triggers[] | false = 'hover'; + readonly pause = input('hover'); + /** * Support left/right swipe interactions on touchscreen devices. - * @type boolean + * @return boolean * @default true */ - @Input() touch: boolean = true; + readonly touch = input(true); + /** * Set type of the transition. - * @type {'slide' | 'crossfade'} + * @return {'slide' | 'crossfade'} * @default 'slide' */ - @Input() transition: 'slide' | 'crossfade' = 'slide'; + readonly transition = input<'slide' | 'crossfade'>('slide'); + /** * Set whether the carousel should cycle continuously or have hard stops. - * @type boolean + * @return boolean * @default true */ - @Input() wrap = true; + readonly wrap = input(true); + /** * Event emitted on carousel item change. [docs] - * @type number + * @return number */ - @Output() itemChange = new EventEmitter(); - - @HostBinding('class') - get hostClasses(): any { - return { - carousel: true, - slide: true, - 'carousel-dark': !!this.dark, - 'carousel-fade': this.transition === 'crossfade' - }; - } + readonly itemChange = output(); - private carouselIndexSubscription?: Subscription; - private timerId!: any; - private intersectingSubscription?: Subscription; + private timerId: ReturnType | undefined; private activeItemInterval = 0; private swipeSubscription?: Subscription; - - constructor( - @Inject(CarouselConfig) private config: CarouselConfig, - private hostElement: ElementRef, - private carouselService: CarouselService, - private carouselState: CarouselState, - private intersectionService: IntersectionService, - private listenersService: ListenersService - ) { - Object.assign(this, config); - } + readonly #destroyRef = inject(DestroyRef); ngOnInit(): void { this.carouselStateSubscribe(); } ngOnDestroy(): void { + this.resetTimer(); this.clearListeners(); - this.carouselStateSubscribe(false); - this.intersectionServiceSubscribe(false); this.swipeSubscribe(false); } ngAfterContentInit(): void { - this.intersectionService.createIntersectionObserver(this.hostElement); this.intersectionServiceSubscribe(); - this.carouselState.state = { activeItemIndex: this.activeIndex, animate: this.animate }; + this.#carouselState.state = { + activeItemIndex: this.activeIndex(), + animate: this.animate(), + interval: this.interval(), + transition: this.transition() + }; this.setListeners(); this.swipeSubscribe(); } private setListeners(): void { const config: IListenersConfig = { - hostElement: this.hostElement, - trigger: this.pause || [], + hostElement: this.#hostElement, + trigger: this.pause() || [], callbackOff: () => { this.setTimer(); }, @@ -139,78 +176,86 @@ export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { this.resetTimer(); } }; - this.listenersService.setListeners(config); + this.#listenersService.setListeners(config); } private clearListeners(): void { - this.listenersService.clearListeners(); + this.#listenersService.clearListeners(); } set visible(value) { - this._visible = value; + this.#visible = value; } get visible() { - return this._visible; + return this.#visible; } - private _visible: boolean = true; + #visible: boolean = true; setTimer(): void { - const interval = this.activeItemInterval || 0; + const interval = this.activeItemInterval || this.interval(); + const direction = this.direction(); this.resetTimer(); if (interval > 0) { this.timerId = setTimeout(() => { - const nextIndex = this.carouselState.direction(this.direction); - this.carouselState.state = { activeItemIndex: nextIndex }; + const nextIndex = this.#carouselState.direction(direction); + this.#carouselState.state = { activeItemIndex: nextIndex }; }, interval); } } resetTimer(): void { clearTimeout(this.timerId); + this.timerId = undefined; } - private carouselStateSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.carouselIndexSubscription = this.carouselService.carouselIndex$.subscribe((nextItem) => { - if ('active' in nextItem) { - this.itemChange.emit(nextItem.active); - } - this.activeItemInterval = typeof nextItem.interval === 'number' && nextItem.interval > -1 ? nextItem.interval : this.interval; - const isLastItem = ((nextItem.active === nextItem.lastItemIndex) && this.direction === 'next') || ((nextItem.active === 0) && this.direction === 'prev'); - !this.wrap && isLastItem ? this.resetTimer() : this.setTimer(); - }); - } else { - this.carouselIndexSubscription?.unsubscribe(); - } + private carouselStateSubscribe(): void { + this.#carouselService.carouselIndex$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((nextItem) => { + if ('active' in nextItem && typeof nextItem.active === 'number') { + this.itemChange.emit(nextItem.active); + } + this.activeItemInterval = + typeof nextItem.interval === 'number' && nextItem.interval > -1 ? nextItem.interval : this.interval(); + const direction = this.direction(); + const isLastItem = + (nextItem.active === nextItem.lastItemIndex && direction === 'next') || + (nextItem.active === 0 && direction === 'prev'); + !this.wrap() && isLastItem ? this.resetTimer() : this.setTimer(); + }); } - private intersectionServiceSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.intersectingSubscription = this.intersectionService.intersecting$.subscribe(isIntersecting => { - this.visible = isIntersecting; - isIntersecting ? this.setTimer() : this.resetTimer(); + private intersectionServiceSubscribe(): void { + this.#intersectionService.createIntersectionObserver(this.#hostElement); + this.#intersectionService.intersecting$ + .pipe( + filter((next) => next.hostElement === this.#hostElement), + finalize(() => { + this.#intersectionService.unobserve(this.#hostElement); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe((next) => { + this.visible = next.isIntersecting; + next.isIntersecting ? this.setTimer() : this.resetTimer(); }); - } else { - this.intersectingSubscription?.unsubscribe(); - } } private swipeSubscribe(subscribe: boolean = true): void { - if (this.touch && subscribe) { - const carouselElement = this.hostElement.nativeElement; + if (this.touch() && subscribe) { + const carouselElement = this.#hostElement.nativeElement; const touchStart$ = fromEvent(carouselElement, 'touchstart'); const touchEnd$ = fromEvent(carouselElement, 'touchend'); const touchMove$ = fromEvent(carouselElement, 'touchmove'); - this.swipeSubscription = touchStart$.pipe(zipWith(touchEnd$.pipe(withLatestFrom(touchMove$)))) + this.swipeSubscription = touchStart$ + .pipe(zipWith(touchEnd$.pipe(withLatestFrom(touchMove$))), takeUntilDestroyed(this.#destroyRef)) .subscribe(([touchstart, [touchend, touchmove]]) => { touchstart.stopPropagation(); touchmove.stopPropagation(); - const distanceX = touchstart.touches[0].clientX - touchmove.touches[0].clientX; + const distanceX = touchstart.touches[0]?.clientX - touchmove.touches[0]?.clientX || 0; if (Math.abs(distanceX) > 0.3 * carouselElement.clientWidth && touchstart.timeStamp <= touchmove.timeStamp) { - const nextIndex = this.carouselState.direction(distanceX > 0 ? 'next' : 'prev'); - this.carouselState.state = { activeItemIndex: nextIndex }; + const nextIndex = this.#carouselState.direction(distanceX > 0 ? 'next' : 'prev'); + this.#carouselState.state = { activeItemIndex: nextIndex }; } }); } else { diff --git a/projects/coreui-angular/src/lib/collapse/collapse.animations.ts b/projects/coreui-angular/src/lib/collapse/collapse.animations.ts index 68d7df42..4ba17a63 100644 --- a/projects/coreui-angular/src/lib/collapse/collapse.animations.ts +++ b/projects/coreui-angular/src/lib/collapse/collapse.animations.ts @@ -1,24 +1,12 @@ import { animate, animation, style } from '@angular/animations'; -export const expandAnimation = animation([ - animate('{{ time }} {{ easing }}') -]); +export const expandAnimation = animation([animate('{{ time }} {{ easing }}')]); export const collapseAnimation = animation([ style({ height: '*', minHeight: '*' }), - animate('{{ time }} {{ easing }}', - style({ height: 0, minHeight: 0 }) - ) + animate('{{ time }} {{ easing }}', style({ height: 0, minHeight: 0 })) ]); -export const expandHorizontalAnimation = animation([ - animate('{{ time }} {{ easing }}') -]); +export const expandHorizontalAnimation = animation([animate('{{ time }} {{ easing }}')]); -export const collapseHorizontalAnimation = animation([ - // style({ opacity: '*' }), - animate( - '{{ time }} {{ easing }}' - // style({ opacity: 0 }) - ) -]); +export const collapseHorizontalAnimation = animation([animate('{{ time }} {{ easing }}')]); diff --git a/projects/coreui-angular/src/lib/collapse/collapse.directive.spec.ts b/projects/coreui-angular/src/lib/collapse/collapse.directive.spec.ts new file mode 100644 index 00000000..5212c6fa --- /dev/null +++ b/projects/coreui-angular/src/lib/collapse/collapse.directive.spec.ts @@ -0,0 +1,56 @@ +import { CollapseDirective } from './collapse.directive'; +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { By } from '@angular/platform-browser'; + +class MockElementRef extends ElementRef {} + +@Component({ + template: '
Test
', + imports: [CollapseDirective] +}) +class TestComponent { + horizontal = false; + visible = false; +} + +describe('CollapseDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let elementRef: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent, CollapseDirective, NoopAnimationsModule], + providers: [{ provide: ElementRef, useClass: MockElementRef }, Renderer2] + }); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + elementRef = fixture.debugElement.query(By.directive(CollapseDirective)); + component.visible = false; + fixture.detectChanges(); // initial binding + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new CollapseDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', fakeAsync(() => { + expect(elementRef.nativeElement.style.display).toContain('none'); + expect(elementRef.nativeElement).not.toHaveClass('collapse-horizontal'); + component.horizontal = true; + component.visible = true; + fixture.detectChanges(); + expect(elementRef.nativeElement).toHaveClass('collapse-horizontal'); + expect(elementRef.nativeElement.style.display).toBe(''); + component.horizontal = false; + component.visible = false; + fixture.detectChanges(); + expect(elementRef.nativeElement).not.toHaveClass('collapse-horizontal'); + })); +}); diff --git a/projects/coreui-angular/src/lib/collapse/collapse.directive.ts b/projects/coreui-angular/src/lib/collapse/collapse.directive.ts index 9999a630..8ee5d9bd 100644 --- a/projects/coreui-angular/src/lib/collapse/collapse.directive.ts +++ b/projects/coreui-angular/src/lib/collapse/collapse.directive.ts @@ -1,20 +1,20 @@ +import { AnimationBuilder, AnimationPlayer, useAnimation } from '@angular/animations'; + import { - AfterViewInit, + afterNextRender, + booleanAttribute, + computed, Directive, - DoCheck, + effect, ElementRef, - EventEmitter, - HostBinding, - Input, - OnChanges, + inject, + input, + linkedSignal, OnDestroy, - Output, + output, Renderer2, - SimpleChanges + signal } from '@angular/core'; -import { AnimationBuilder, AnimationPlayer, useAnimation } from '@angular/animations'; - -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { collapseAnimation, @@ -23,210 +23,167 @@ import { expandHorizontalAnimation } from './collapse.animations'; -// todo -// tslint:disable-next-line:no-conflicting-lifecycle @Directive({ selector: '[cCollapse]', - exportAs: 'cCollapse' + exportAs: 'cCollapse', + host: { '[class]': 'hostClasses()', '[style]': '{ display: "none" }' } }) -export class CollapseDirective implements OnChanges, OnDestroy, DoCheck, AfterViewInit { - - static ngAcceptInputType_horizontal: BooleanInput; - static ngAcceptInputType_navbar: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; +export class CollapseDirective implements OnDestroy { + readonly #hostElement = inject(ElementRef); + readonly #renderer = inject(Renderer2); + readonly #animationBuilder = inject(AnimationBuilder); + #player: AnimationPlayer | undefined = undefined; + + constructor() { + afterNextRender({ + read: () => { + this.#initialized.set(true); + } + }); + } /** * @ignore */ - @Input() - set animate(value: boolean) { - this._animate = value; - } - - get animate(): boolean { - return this._animate; - } + readonly animateInput = input(true, { transform: booleanAttribute, alias: 'animate' }); - private _animate = true; + readonly animate = linkedSignal({ + source: this.animateInput, + computation: (value: boolean) => value + }); /** * Set horizontal collapsing to transition the width instead of height. + * @type boolean + * @default false */ - @Input() - set horizontal(value: boolean) { - this._horizontal = coerceBooleanProperty(value); - } - - get horizontal(): boolean { - return this._horizontal; - } - - private _horizontal: boolean = false; + readonly horizontal = input(false, { transform: booleanAttribute }); /** * Toggle the visibility of collapsible element. + * @type boolean + * @default false */ - @Input() - set visible(value) { - this._visible = coerceBooleanProperty(value); - } + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); - get visible(): boolean { - return this._visible; - } + readonly visibleChange = output(); - private _visible = false; + readonly visible = linkedSignal({ source: this.visibleInput, computation: (value: boolean) => value }); + + readonly #initialized = signal(false); + + readonly #visibleEffect = effect(() => { + const visible = this.visible(); + if (this.#initialized()) { + this.createPlayer(visible); + } + }); /** * Add `navbar` prop for grouping and hiding navbar contents by a parent breakpoint. + * @type boolean + * @default false */ - @Input() - set navbar(value: boolean) { - this._navbar = coerceBooleanProperty(value); - }; - - get navbar() { - return this._navbar; - } - - private _navbar = false; + readonly navbar = input(false, { transform: booleanAttribute }); /** * @ignore */ - @Input() duration = '350ms'; + readonly duration = input('350ms'); + /** * @ignore */ - @Input() transition = 'ease'; + readonly transition = input('ease'); + /** * Event emitted on visibility change. [docs] * @type string */ - @Output() collapseChange = new EventEmitter(); - - private player!: AnimationPlayer; - private readonly host: HTMLElement; - // private scrollHeight!: number; - private scrollWidth!: number; - private collapsing: boolean = false; - - constructor( - private hostElement: ElementRef, - private renderer: Renderer2, - private animationBuilder: AnimationBuilder - ) { - this.host = this.hostElement.nativeElement; - this.renderer.setStyle(this.host, 'display', 'none'); - } + readonly collapseChange = output(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { - 'navbar-collapse': this.navbar, - 'collapse-horizontal': this.horizontal - }; - } - - ngAfterViewInit(): void { - if (this.visible) { - this.toggle(); - } - } + 'navbar-collapse': this.navbar(), + 'collapse-horizontal': this.horizontal() + } as Record; + }); ngOnDestroy(): void { this.destroyPlayer(); } - ngOnChanges(changes: SimpleChanges): void { - if (changes['visible']) { - if (!changes['visible'].firstChange || !changes['visible'].currentValue) { - this.toggle(changes['visible'].currentValue); - } - } - } - - ngDoCheck(): void { - if (this._visible !== this.visible) { - this.toggle(); - } - } - - toggle(visible = this.visible): void { - this.createPlayer(visible); - this.player?.play(); + toggle(visible = !this.visible()): void { + this.visible.set(visible); } destroyPlayer(): void { - this.player?.destroy(); + this.#player?.destroy(); + this.#player = undefined; } - createPlayer(visible: boolean = this.visible): void { - if (this.player?.hasStarted()) { + createPlayer(visible: boolean = this.visible()): void { + if (this.#player?.hasStarted()) { this.destroyPlayer(); } + const host: HTMLElement = this.#hostElement.nativeElement; + if (visible) { - this.renderer.removeStyle(this.host, 'display'); + this.#renderer.removeStyle(host, 'display'); } - const duration = this.animate ? this.duration : '0ms'; + const duration = this.animate() ? this.duration() : '0ms'; - const expand = this.horizontal ? expandHorizontalAnimation : expandAnimation; - const collapse = this.horizontal ? collapseHorizontalAnimation : collapseAnimation; + const expand = this.horizontal() ? expandHorizontalAnimation : expandAnimation; + const collapse = this.horizontal() ? collapseHorizontalAnimation : collapseAnimation; - const dimension = this.horizontal ? 'width' : 'height'; + const dimension = this.horizontal() ? 'width' : 'height'; const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); const scrollSize = `scroll${capitalizedDimension}`; - const animationFactory = this.animationBuilder.build( - useAnimation(visible ? expand : collapse, { params: { time: duration, easing: this.transition } }) + const animationFactory = this.#animationBuilder?.build( + useAnimation(visible ? expand : collapse, { params: { time: duration, easing: this.transition() } }) ); - this.player = animationFactory.create(this.host); + this.#player = animationFactory.create(host); - this.renderer.setStyle(this.host, dimension, visible ? 0 : `${this.host.getBoundingClientRect()[dimension]}px`); + !visible && host.offsetHeight && host.style[dimension] && host.scrollHeight; - !visible && this.host.offsetHeight; + this.#renderer.setStyle(host, dimension, visible ? 0 : `${host.getBoundingClientRect()[dimension]}px`); - this.player.onStart(() => { + this.#player.onStart(() => { this.setMaxSize(); - this.renderer.removeClass(this.host, 'collapse'); - this.renderer.addClass(this.host, 'collapsing'); - this.renderer.removeClass(this.host, 'show'); - this.collapsing = true; - if (visible) { - // @ts-ignore - this.renderer.setStyle(this.host, dimension, `${this.host[scrollSize]}px`); - } else { - this.renderer.setStyle(this.host, dimension, ''); - } - this.collapseChange.emit(visible ? 'opening' : 'collapsing'); + this.#renderer.removeClass(host, 'collapse'); + this.#renderer.addClass(host, 'collapsing'); + this.#renderer.removeClass(host, 'show'); + this.#renderer.setStyle(host, dimension, visible ? `${(host as any)[scrollSize]}px` : ''); + this.collapseChange?.emit(visible ? 'opening' : 'collapsing'); }); - this.player.onDone(() => { - this.visible = visible; - this.collapsing = false; - this.renderer.removeClass(this.host, 'collapsing'); - this.renderer.addClass(this.host, 'collapse'); + + this.#player.onDone(() => { + this.#renderer.removeClass(host, 'collapsing'); + this.#renderer.addClass(host, 'collapse'); if (visible) { - this.renderer.addClass(this.host, 'show'); - this.renderer.setStyle(this.host, dimension, ''); + this.#renderer.addClass(host, 'show'); + this.#renderer.setStyle(host, dimension, ''); } else { - this.renderer.removeClass(this.host, 'show'); + this.#renderer.removeClass(host, 'show'); } - this.collapseChange.emit(visible ? 'open' : 'collapsed'); + this.collapseChange?.emit(visible ? 'open' : 'collapsed'); + this.destroyPlayer(); + this.visibleChange.emit(visible); }); + + this.#player?.play(); } setMaxSize() { - // setTimeout(() => { - if (this.horizontal) { - this.scrollWidth = this.host.scrollWidth; - this.scrollWidth > 0 && this.renderer.setStyle(this.host, 'maxWidth', `${this.scrollWidth}px`); + const host = this.#hostElement.nativeElement; + if (this.horizontal()) { + host.scrollWidth > 0 && this.#renderer.setStyle(host, 'maxWidth', `${host.scrollWidth}px`); // } else { - // this.scrollHeight = this.host.scrollHeight; - // this.scrollHeight > 0 && this.renderer.setStyle(this.host, 'maxHeight', `${this.scrollHeight}px`); + // host.scrollHeight > 0 && this.#renderer.setStyle(host, 'maxHeight', `${host.scrollHeight}px`); } - // }); } } diff --git a/projects/coreui-angular/src/lib/collapse/collapse.module.ts b/projects/coreui-angular/src/lib/collapse/collapse.module.ts index 06e2cb16..d9ecb16c 100644 --- a/projects/coreui-angular/src/lib/collapse/collapse.module.ts +++ b/projects/coreui-angular/src/lib/collapse/collapse.module.ts @@ -1,13 +1,9 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; +import { ModuleWithProviders, NgModule } from '@angular/core'; import { CollapseDirective } from './collapse.directive'; @NgModule({ - declarations: [CollapseDirective], exports: [CollapseDirective], - imports: [ - CommonModule - ] + imports: [CollapseDirective] }) export class CollapseModule { static forRoot(): ModuleWithProviders { diff --git a/projects/coreui-angular/src/lib/coreui.types.ts b/projects/coreui-angular/src/lib/coreui.types.ts index af22f41a..1dd95bdc 100644 --- a/projects/coreui-angular/src/lib/coreui.types.ts +++ b/projects/coreui-angular/src/lib/coreui.types.ts @@ -1,5 +1,10 @@ import { IsActiveMatchOptions } from '@angular/router'; +export declare type BooleanInput = string | boolean | null | undefined; +export declare type NumberInput = string | number | null | undefined; + +export type NgCssClass = string | string[] | Set | { [klass: string]: any }; + export enum BreakpointInfix { xs = 'xs', sm = 'sm', @@ -24,10 +29,19 @@ export type Colors = | 'info' | 'dark' | 'light' + | 'primary-gradient' + | 'secondary-gradient' + | 'success-gradient' + | 'danger-gradient' + | 'warning-gradient' + | 'info-gradient' + | 'dark-gradient' + | 'light-gradient' | string; -export type ColorsGradient = - | `${Colors}-gradient`; +// export type ColorsGradient = +// | Colors +// | `${Colors}-gradient`; export type BackgroundColors = Colors | 'body' | 'white' | 'transparent'; @@ -35,33 +49,26 @@ export type Directions = 'down' | 'up' | 'start' | 'end' | ''; export type TextColors = | Colors + | 'primary-emphasis' + | 'secondary-emphasis' + | 'success-emphasis' + | 'danger-emphasis' + | 'warning-emphasis' + | 'info-emphasis' + | 'light-emphasis' | 'body' - | 'white' - | 'muted' + | 'body-emphasis' + | 'body-secondary' + | 'body-tertiary' + | 'black' | 'black-50' + | 'white' | 'white-50' - | 'high-emphasis' - | 'medium-emphasis' - | 'disabled' - | 'high-emphasis-inverse' - | 'medium-emphasis-inverse' - | 'disabled-inverse'; - -export type Alignment = - | 'baseline' - | 'top' - | 'middle' - | 'bottom' - | 'text-top' - | 'text-bottom'; + | string; -export type BadgePositions = - | 'top-start' - | 'top-end' - | 'bottom-end' - | 'bottom-start' - | string - | undefined; +export type Alignment = 'baseline' | 'top' | 'middle' | 'bottom' | 'text-top' | 'text-bottom'; + +export type BadgePositions = 'top-start' | 'top-end' | 'bottom-end' | 'bottom-start' | string | undefined; export type Placements = | 'auto' @@ -95,7 +102,7 @@ export type Shapes = | 'rounded-3' | string; -export type Triggers = 'hover' | 'focus' | 'click'; +export type Triggers = 'hover' | 'focus' | 'click' | 'focusin'; export type Positions = 'fixed' | 'sticky'; diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.spec.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.spec.ts index 3a75bbe2..ebe72672 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.spec.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.spec.ts @@ -1,10 +1,69 @@ +import { Component, DebugElement, ElementRef, Renderer2, viewChild } from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; import { DropdownService } from '../dropdown.service'; import { DropdownCloseDirective } from './dropdown-close.directive'; +import { ButtonCloseDirective } from '../../button'; +import { DropdownComponent } from '../dropdown/dropdown.component'; +import { DropdownMenuDirective } from '../dropdown-menu/dropdown-menu.directive'; + +class MockElementRef extends ElementRef {} + +@Component({ + template: ` + +
+ +
+
+ `, + imports: [ButtonCloseDirective, DropdownComponent, DropdownMenuDirective, DropdownCloseDirective] +}) +class TestComponent { + disabled = false; + readonly dropdown = viewChild(DropdownComponent); +} describe('DropdownCloseDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let elementRef: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [{ provide: ElementRef, useClass: MockElementRef }, Renderer2, DropdownService] + }); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + elementRef = fixture.debugElement.query(By.directive(DropdownCloseDirective)); + component.disabled = false; + fixture.detectChanges(); // initial binding + }); + it('should create an instance', () => { - const dropdownService = new DropdownService(); - const directive = new DropdownCloseDirective(dropdownService); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new DropdownCloseDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should have css classes and attributes', fakeAsync(() => { + expect(elementRef.nativeElement).not.toHaveClass('disabled'); + expect(elementRef.nativeElement.getAttribute('aria-disabled')).toBeNull(); + expect(elementRef.nativeElement.getAttribute('tabindex')).toBe('0'); + component.disabled = true; + fixture.detectChanges(); + expect(elementRef.nativeElement).toHaveClass('disabled'); + expect(elementRef.nativeElement.getAttribute('aria-disabled')).toBe('true'); + expect(elementRef.nativeElement.getAttribute('tabindex')).toBe('-1'); + })); + + it('should call event handling functions', fakeAsync(() => { + expect(component.dropdown()?.visible()).toBeTrue(); + elementRef.nativeElement.dispatchEvent(new Event('click')); + elementRef.nativeElement.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter' })); + expect(component.dropdown()?.visible()).toBeFalse(); + })); }); diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.ts index 866b6c8a..74b381fc 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-close/dropdown-close.directive.ts @@ -1,65 +1,64 @@ -import { AfterViewInit, Directive, HostBinding, HostListener, Input, Optional } from '@angular/core'; +import { AfterViewInit, booleanAttribute, Directive, inject, input, linkedSignal } from '@angular/core'; import { DropdownService } from '../dropdown.service'; import { DropdownComponent } from '../dropdown/dropdown.component'; @Directive({ selector: '[cDropdownClose]', - exportAs: 'cDropdownClose' + exportAs: 'cDropdownClose', + host: { + '[class.disabled]': 'disabled()', + '[attr.aria-disabled]': 'disabled() || null', + '[attr.tabindex]': 'tabIndex()', + '(click)': 'onClick($event)', + '(keyup)': 'onKeyUp($event)' + } }) export class DropdownCloseDirective implements AfterViewInit { - - constructor( - private dropdownService: DropdownService, - @Optional() public dropdown?: DropdownComponent - ) { } + #dropdownService = inject(DropdownService); + dropdown? = inject(DropdownComponent, { optional: true }); /** * Disables a dropdown-close directive. - * @type boolean - * @default undefined + * @return boolean + * @default false */ - @Input() disabled?: boolean; + readonly disabledInput = input(false, { transform: booleanAttribute, alias: 'disabled' }); + + readonly disabled = linkedSignal({ + source: this.disabledInput, + computation: (value) => value || null + }); - @Input() dropdownComponent?: DropdownComponent; + readonly dropdownComponent = input(); ngAfterViewInit(): void { - if (this.dropdownComponent) { - this.dropdown = this.dropdownComponent; - this.dropdownService = this.dropdownComponent?.dropdownService; + const dropdownComponent = this.dropdownComponent(); + if (dropdownComponent) { + this.dropdown = dropdownComponent; + this.#dropdownService = dropdownComponent?.dropdownService; } } - @HostBinding('class') - get hostClasses(): any { - return { - disabled: this.disabled - }; - } + readonly tabIndexInput = input(null, { alias: 'tabIndex' }); - @HostBinding('attr.tabindex') - @Input() - set tabIndex(value: string | number | null) { - this._tabIndex = value; - } - get tabIndex() { - return this.disabled ? '-1' : this._tabIndex; - } - private _tabIndex: string | number | null = null; + readonly tabIndex = linkedSignal({ + source: this.tabIndexInput, + computation: (value) => (this.disabled() ? '-1' : value) + }); - @HostBinding('attr.aria-disabled') - get isDisabled(): boolean | null { - return this.disabled || null; + onClick($event: MouseEvent): void { + this.handleToggle(); } - @HostListener('click', ['$event']) - private onClick($event: MouseEvent): void { - !this.disabled && this.dropdownService.toggle({ visible: false, dropdown: this.dropdown }); + onKeyUp($event: KeyboardEvent): void { + if ($event.key === 'Enter') { + this.handleToggle(); + } } - @HostListener('keyup', ['$event']) - private onKeyUp($event: KeyboardEvent): void { - if ($event.key === 'Enter') { - !this.disabled && this.dropdownService.toggle({ visible: false, dropdown: this.dropdown }); + private handleToggle(): void { + if (!this.disabled()) { + this.#dropdownService.toggle({ visible: false, dropdown: this.dropdown }); } } } diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-divider/dropdown-divider.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-divider/dropdown-divider.directive.ts index f8ab4518..045524e2 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-divider/dropdown-divider.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-divider/dropdown-divider.directive.ts @@ -1,19 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cDropdownDivider]' + selector: '[cDropdownDivider]', + host: { class: 'dropdown-divider' } }) -export class DropdownDividerDirective { - - constructor() { - } - - @HostBinding('class') - get hostClasses(): any { - - return { - 'dropdown-divider': true, - }; - } - -} +export class DropdownDividerDirective {} diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-header/dropdown-header.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-header/dropdown-header.directive.ts index 3cd02a0c..1410511a 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-header/dropdown-header.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-header/dropdown-header.directive.ts @@ -1,19 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cDropdownHeader]' + selector: '[cDropdownHeader]', + host: { class: 'dropdown-header' } }) -export class DropdownHeaderDirective { - - constructor() { - } - - @HostBinding('class') - get hostClasses(): any { - - return { - 'dropdown-header': true, - }; - } - -} +export class DropdownHeaderDirective {} diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item-plain.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item-plain.directive.ts index 4e7736f4..adc25756 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item-plain.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item-plain.directive.ts @@ -1,19 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cDropdownItemPlain]' + selector: '[cDropdownItemPlain]', + host: { class: 'dropdown-item-text' } }) -export class DropdownItemPlainDirective { - - constructor() { - } - - @HostBinding('class') - get hostClasses(): any { - - return { - 'dropdown-item-text': true, - }; - } - -} +export class DropdownItemPlainDirective {} diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts index efecbdb3..961f5a94 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts @@ -1,11 +1,88 @@ -import { DropdownService } from '../dropdown.service'; +import { Component, DebugElement, ElementRef, Renderer2, viewChild } from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; + import { DropdownItemDirective } from './dropdown-item.directive'; +import { DropdownService } from '../dropdown.service'; +import { DropdownComponent } from '../dropdown/dropdown.component'; +import { DropdownMenuDirective } from '../dropdown-menu/dropdown-menu.directive'; +import { By } from '@angular/platform-browser'; +import { DOCUMENT } from '@angular/common'; + +class MockElementRef extends ElementRef {} + +@Component({ + template: ` + +
    +
  • + +
  • +
+
+ `, + imports: [DropdownComponent, DropdownMenuDirective, DropdownItemDirective] +}) +class TestComponent { + disabled = false; + active = false; + readonly dropdown = viewChild(DropdownComponent); + readonly item = viewChild(DropdownItemDirective); +} describe('DropdownItemDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let elementRef: DebugElement; + let document: Document; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [{ provide: ElementRef, useClass: MockElementRef }, Renderer2, DropdownService] + }); + + document = TestBed.inject(DOCUMENT); + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + elementRef = fixture.debugElement.query(By.directive(DropdownItemDirective)); + component.disabled = false; + fixture.detectChanges(); // initial binding + }); it('should create an instance', () => { - const dropdownService = new DropdownService(); - const directive = new DropdownItemDirective(dropdownService); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new DropdownItemDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should have css classes and attributes', fakeAsync(() => { + expect(elementRef.nativeElement).not.toHaveClass('disabled'); + expect(elementRef.nativeElement.getAttribute('aria-disabled')).toBeNull(); + expect(elementRef.nativeElement.getAttribute('aria-current')).toBeNull(); + expect(elementRef.nativeElement.getAttribute('tabindex')).toBe('0'); + component.disabled = true; + component.active = true; + fixture.detectChanges(); + expect(elementRef.nativeElement).toHaveClass('disabled'); + expect(elementRef.nativeElement.getAttribute('aria-disabled')).toBe('true'); + expect(elementRef.nativeElement.getAttribute('aria-current')).toBe('true'); + expect(elementRef.nativeElement.getAttribute('tabindex')).toBe('-1'); + })); + + it('should call event handling functions', fakeAsync(() => { + expect(component.dropdown()?.visible()).toBeTrue(); + elementRef.nativeElement.dispatchEvent(new Event('click')); + elementRef.nativeElement.dispatchEvent(new KeyboardEvent('keydown', { key: 'Tab' })); + elementRef.nativeElement.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter' })); + fixture.detectChanges(); + elementRef.nativeElement.focus(); + // @ts-ignore + const label = component.item()?.getLabel() ?? undefined; + expect(label).toBe('Action'); + component.item()?.focus(); + expect(document.activeElement).toBe(elementRef.nativeElement); + })); }); diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts index e3479aaf..7fda9807 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts @@ -1,79 +1,103 @@ -import { Directive, HostBinding, HostListener, Input, Optional } from '@angular/core'; +import { FocusableOption, FocusOrigin } from '@angular/cdk/a11y'; +import { booleanAttribute, computed, Directive, ElementRef, inject, input, linkedSignal } from '@angular/core'; import { DropdownService } from '../dropdown.service'; import { DropdownComponent } from '../dropdown/dropdown.component'; @Directive({ selector: '[cDropdownItem]', - exportAs: 'cDropdownItem' + exportAs: 'cDropdownItem', + host: { + class: 'dropdown-item', + '[class]': 'hostClasses()', + '[attr.tabindex]': 'tabIndex()', + '[attr.aria-current]': 'ariaCurrent()', + '[attr.aria-disabled]': 'disabled || null', + '[role]': 'role()', + '(click)': 'onClick($event)', + '(keyup)': 'onKeyUp($event)' + } }) -export class DropdownItemDirective { +export class DropdownItemDirective implements FocusableOption { + readonly #elementRef: ElementRef = inject(ElementRef); + readonly #dropdownService = inject(DropdownService); + dropdown? = inject(DropdownComponent, { optional: true }); + /** * Set active state to a dropdown-item. - * @type boolean + * @return boolean * @default undefined */ - @Input() active?: boolean; + readonly active = input(); + /** * Configure dropdown-item close dropdown behavior. - * @type boolean + * @return boolean * @default true */ - @Input() autoClose: boolean = true; + readonly autoClose = input(true); + /** * Disables a dropdown-item. - * @type boolean + * @return boolean * @default undefined */ - @Input() disabled?: boolean; + readonly disabledInput = input(false, { transform: booleanAttribute, alias: 'disabled' }); - constructor( - private dropdownService: DropdownService, - @Optional() public dropdown?: DropdownComponent - ) { - } + readonly #disabled = linkedSignal({ + source: this.disabledInput, + computation: (value) => value + }); - @HostBinding('attr.aria-current') - get ariaCurrent(): string | null { - return this.active ? 'true' : null; + set disabled(value) { + this.#disabled.set(value); } - @HostBinding('class') - get hostClasses(): any { - return { - 'dropdown-item': true, - active: this.active, - disabled: this.disabled - }; + get disabled() { + return this.#disabled(); } - @HostBinding('attr.tabindex') - @Input() - set tabIndex(value: string | number | null) { - this._tabIndex = value; + readonly role = input('list-item'); + + readonly tabIndexInput = input('0', { alias: 'tabIndex' }); + + readonly tabIndex = linkedSignal({ + source: this.tabIndexInput, + computation: (value) => (this.disabled ? '-1' : value) + }); + + focus(origin?: FocusOrigin | undefined): void { + this.#elementRef?.nativeElement?.focus(); } - get tabIndex() { - return this.disabled ? '-1' : this._tabIndex; + + getLabel?(): string { + return this.#elementRef?.nativeElement?.textContent.trim(); } - private _tabIndex: string | number | null = null; - @HostBinding('attr.aria-disabled') - get isDisabled(): boolean | null { - return this.disabled || null; + readonly ariaCurrent = computed(() => { + return this.active() ? 'true' : null; + }); + + readonly hostClasses = computed(() => { + return { + 'dropdown-item': true, + active: this.active(), + disabled: this.disabled + } as Record; + }); + + onClick($event: MouseEvent): void { + this.handleInteraction(); } - @HostListener('click', ['$event']) - private onClick($event: MouseEvent): void { - if (this.autoClose) { - this.dropdownService.toggle({ visible: 'toggle', dropdown: this.dropdown }); + onKeyUp($event: KeyboardEvent): void { + if ($event.key === 'Enter') { + this.handleInteraction(); } } - @HostListener('keyup', ['$event']) - private onKeyUp($event: KeyboardEvent): void { - if ($event.key === 'Enter') { - if (this.autoClose) { - this.dropdownService.toggle({ visible: false, dropdown: this.dropdown }); - } + private handleInteraction(): void { + if (this.autoClose()) { + this.#dropdownService.toggle({ visible: 'toggle', dropdown: this.dropdown }); } } } diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts index d89e9253..0204f322 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts @@ -1,12 +1,101 @@ -import { ElementRef } from '@angular/core'; +import { Component, DebugElement, ElementRef, Renderer2, viewChild } from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; import { DropdownService } from '../dropdown.service'; import { DropdownMenuDirective } from './dropdown-menu.directive'; +import { DropdownComponent, DropdownToggleDirective } from '../dropdown/dropdown.component'; +import { DOCUMENT } from '@angular/common'; +import { By } from '@angular/platform-browser'; +import { DropdownItemDirective } from '../dropdown-item/dropdown-item.directive'; +import { ButtonDirective } from '../../button'; + +class MockElementRef extends ElementRef {} + +@Component({ + template: ` + + +
    +
  • + +
  • +
+
+ `, + imports: [DropdownComponent, DropdownMenuDirective, DropdownItemDirective, ButtonDirective, DropdownToggleDirective] +}) +class TestComponent { + visible = true; + alignment?: string; + readonly dropdown = viewChild(DropdownComponent); + readonly menu = viewChild(DropdownMenuDirective); + readonly item = viewChild(DropdownItemDirective); +} describe('DropdownMenuDirective', () => { - let elementRef: ElementRef; + let component: TestComponent; + let fixture: ComponentFixture; + let dropdownRef: DebugElement; + let elementRef: DebugElement; + let itemRef: DebugElement; + let document: Document; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [{ provide: ElementRef, useClass: MockElementRef }, Renderer2, DropdownService] + }); + document = TestBed.inject(DOCUMENT); + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + dropdownRef = fixture.debugElement.query(By.directive(DropdownComponent)); + elementRef = fixture.debugElement.query(By.directive(DropdownMenuDirective)); + itemRef = fixture.debugElement.query(By.directive(DropdownItemDirective)); + component.visible = true; + fixture.detectChanges(); // initial binding + }); + it('should create an instance', () => { - const dropdownService = new DropdownService(); - const directive = new DropdownMenuDirective(elementRef, dropdownService); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new DropdownMenuDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should have css classes', fakeAsync(() => { + component.visible = false; + fixture.detectChanges(); + expect(dropdownRef.nativeElement).not.toHaveClass('show'); + expect(elementRef.nativeElement).toHaveClass('dropdown-menu'); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-menu-end'); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-menu-start'); + expect(elementRef.nativeElement).not.toHaveClass('show'); + component.visible = true; + component.alignment = 'end'; + fixture.detectChanges(); + expect(dropdownRef.nativeElement).toHaveClass('show'); + expect(elementRef.nativeElement).toHaveClass('dropdown-menu-end'); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-menu-start'); + expect(elementRef.nativeElement).toHaveClass('show'); + component.alignment = 'start'; + fixture.detectChanges(); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-menu-end'); + expect(elementRef.nativeElement).toHaveClass('dropdown-menu-start'); + component.alignment = undefined; + fixture.detectChanges(); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-menu-end'); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-menu-start'); + })); + + it('should call event handling functions', fakeAsync(() => { + expect(document.activeElement).not.toEqual(elementRef.nativeElement); + elementRef.nativeElement.dispatchEvent(new KeyboardEvent('keydown', { code: 'Space' })); + elementRef.nativeElement.dispatchEvent(new KeyboardEvent('keyup', { key: 'Tab' })); + component.visible = true; + fixture.detectChanges(); + elementRef.nativeElement.dispatchEvent(new KeyboardEvent('keydown', { code: 'Space' })); + elementRef.nativeElement.dispatchEvent(new KeyboardEvent('keyup', { key: 'Tab' })); + elementRef.nativeElement.focus(); + fixture.detectChanges(); + expect(document.activeElement).toEqual(itemRef.nativeElement); + })); }); diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts index 626696b8..d80248b0 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts @@ -1,83 +1,143 @@ -import { Directive, ElementRef, HostBinding, Input, OnDestroy, OnInit, } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { FocusKeyManager } from '@angular/cdk/a11y'; +import { + AfterContentInit, + booleanAttribute, + computed, + contentChildren, + DestroyRef, + Directive, + ElementRef, + forwardRef, + inject, + input, + linkedSignal, + OnInit +} from '@angular/core'; +import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'; +import { tap } from 'rxjs/operators'; + +import { ThemeDirective } from '../../shared/theme.directive'; +import { DropdownItemDirective } from '../dropdown-item/dropdown-item.directive'; import { DropdownService } from '../dropdown.service'; @Directive({ selector: '[cDropdownMenu]', exportAs: 'cDropdownMenu', + hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }], + host: { + class: 'dropdown-menu', + '[class]': 'hostClasses()', + '[style]': 'hostStyles()', + '(keydown)': 'onKeyDown($event)', + '(keyup)': 'onKeyUp($event)' + } }) -export class DropdownMenuDirective implements OnInit, OnDestroy { - static ngAcceptInputType_dark: BooleanInput; - - constructor( - public elementRef: ElementRef, - private dropdownService: DropdownService - ) {} +export class DropdownMenuDirective implements OnInit, AfterContentInit { + readonly #destroyRef: DestroyRef = inject(DestroyRef); + public readonly elementRef: ElementRef = inject(ElementRef); + readonly #dropdownService: DropdownService = inject(DropdownService); + #focusKeyManager!: FocusKeyManager; /** * Set alignment of dropdown menu. - * @type {'start' | 'end' } + * @return 'start' | 'end' */ - @Input() alignment?: 'start' | 'end' | string; + readonly alignment = input<'start' | 'end' | string>(); /** * Toggle the visibility of dropdown menu component. + * @return boolean */ - @Input() visible = false; + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); - /** - * Sets a darker color scheme to match a dark navbar. - */ - @Input() - get dark(): boolean { - return this._dark; - } - set dark(value: boolean) { - this._dark = coerceBooleanProperty(value); - } - private _dark = false; - - private dropdownStateSubscription!: Subscription; + readonly visible = linkedSignal({ + source: this.visibleInput, + computation: (value) => value + }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const alignment = this.alignment(); + const visible = this.visible(); return { 'dropdown-menu': true, - 'dropdown-menu-dark': this.dark, - [`dropdown-menu-${this.alignment}`]: !!this.alignment, - show: this.visible, - }; - } + [`dropdown-menu-${alignment}`]: !!alignment, + show: visible + } as Record; + }); - @HostBinding('style') - get hostStyles() { + readonly hostStyles = computed(() => { // workaround for popper position calculate (see also: dropdown.component) + const visible = this.visible(); return { - visibility: this.visible ? null : '', - display: this.visible ? null : '', - }; + visibility: visible ? null : '', + display: visible ? null : '' + } as Record; + }); + + onKeyDown($event: KeyboardEvent): void { + if (!this.visible()) { + return; + } + if (['Space', 'ArrowDown'].includes($event.code)) { + $event.preventDefault(); + } + this.#focusKeyManager.onKeydown($event); } - ngOnInit(): void { - this.dropdownStateSubscribe(); + onKeyUp($event: KeyboardEvent): void { + if (!this.visible()) { + return; + } + if (['Tab'].includes($event.key)) { + if (this.#focusKeyManager.activeItem) { + $event.shiftKey ? this.#focusKeyManager.setPreviousItemActive() : this.#focusKeyManager.setNextItemActive(); + } else { + this.#focusKeyManager.setFirstItemActive(); + } + } } - ngOnDestroy(): void { - this.dropdownStateSubscribe(false); + readonly dropdownItemsContent = contentChildren( + forwardRef(() => DropdownItemDirective), + { descendants: true } + ); + + readonly items$ = toObservable(this.dropdownItemsContent); + + ngAfterContentInit(): void { + this.focusKeyManagerInit(); + + this.items$ + .pipe( + tap((change) => { + this.focusKeyManagerInit(); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(); } - private dropdownStateSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.dropdownStateSubscription = - this.dropdownService.dropdownState$.subscribe((state) => { + ngOnInit(): void { + this.#dropdownService.dropdownState$ + .pipe( + tap((state) => { if ('visible' in state) { - this.visible = - state.visible === 'toggle' ? !this.visible : state.visible; + this.visible.update((visible) => (state.visible === 'toggle' ? !visible : state.visible)); + if (!this.visible()) { + this.#focusKeyManager?.setActiveItem(-1); + } } - }); - } else { - this.dropdownStateSubscription.unsubscribe(); - } + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(); + } + + private focusKeyManagerInit(): void { + this.#focusKeyManager = new FocusKeyManager(this.dropdownItemsContent()) + .withHomeAndEnd() + .withPageUpDown() + .withWrap() + .skipPredicate((dropdownItem) => dropdownItem.disabled === true); } } diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown.module.ts b/projects/coreui-angular/src/lib/dropdown/dropdown.module.ts index 7f63aefe..3ae0ee1a 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown.module.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown.module.ts @@ -1,5 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { DropdownComponent, DropdownToggleDirective } from './dropdown/dropdown.component'; import { DropdownDividerDirective } from './dropdown-divider/dropdown-divider.directive'; import { DropdownHeaderDirective } from './dropdown-header/dropdown-header.directive'; @@ -10,32 +9,26 @@ import { DropdownService } from './dropdown.service'; import { DropdownCloseDirective } from './dropdown-close/dropdown-close.directive'; @NgModule({ - declarations: [ + imports: [ DropdownComponent, + DropdownCloseDirective, DropdownDividerDirective, DropdownHeaderDirective, DropdownItemDirective, DropdownItemPlainDirective, - DropdownToggleDirective, DropdownMenuDirective, - DropdownCloseDirective - ], - imports: [ - CommonModule, + DropdownToggleDirective ], exports: [ DropdownComponent, + DropdownCloseDirective, DropdownDividerDirective, DropdownHeaderDirective, DropdownItemDirective, DropdownItemPlainDirective, - DropdownToggleDirective, DropdownMenuDirective, - DropdownCloseDirective + DropdownToggleDirective ], - providers: [ - DropdownService, - ] + providers: [DropdownService] }) -export class DropdownModule { -} +export class DropdownModule {} diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts b/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts index 828c38e9..3378607a 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts @@ -12,9 +12,6 @@ export class DropdownService { private dropdownState = new BehaviorSubject({}); dropdownState$ = this.dropdownState.asObservable(); - constructor() { - } - toggle(state: IDropdownState): void { this.dropdownState.next(state); } diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss index 5b79151c..a6336a24 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss +++ b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss @@ -2,7 +2,6 @@ :host-context(.dropdown, .dropup):not(.btn-group) { display: block; - min-width: fit-content; } :host-context(.dropstart, .dropend):not(.btn-group) { diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.spec.ts b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.spec.ts index f40272c4..6c32a2dd 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.spec.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.spec.ts @@ -1,9 +1,12 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { DropdownComponent } from './dropdown.component'; -import { CdkConnectedOverlay } from '@angular/cdk/overlay'; -import { FocusOrigin } from '@angular/cdk/a11y'; -import { DropdownModule } from '../dropdown.module'; +import { DropdownComponent, DropdownToggleDirective } from './dropdown.component'; +import { Component, DebugElement, ElementRef } from '@angular/core'; +import { DropdownService } from '../dropdown.service'; +import { By } from '@angular/platform-browser'; +import { DOCUMENT } from '@angular/common'; +import { DropdownMenuDirective } from '../dropdown-menu/dropdown-menu.directive'; +import { DropdownItemDirective } from '../dropdown-item/dropdown-item.directive'; describe('DropdownComponent', () => { let component: DropdownComponent; @@ -11,10 +14,8 @@ describe('DropdownComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ DropdownComponent ], - imports: [DropdownModule] - }) - .compileComponents(); + imports: [DropdownComponent] + }).compileComponents(); }); beforeEach(() => { @@ -26,4 +27,109 @@ describe('DropdownComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('dropdown'); + }); +}); + +class MockElementRef extends ElementRef {} + +@Component({ + template: ` + +
+ +
+ `, + imports: [DropdownToggleDirective, DropdownComponent, DropdownMenuDirective, DropdownItemDirective] +}) +class TestComponent { + variant: 'btn-group' | 'dropdown' | 'input-group' | 'nav-item' | undefined = 'nav-item'; + visible = false; + disabled = false; + caret = true; + split = false; +} + +describe('DropdownToggleDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let elementRef: DebugElement; + let dropdownRef: DebugElement; + let service: DropdownService; + let document: Document; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [ + { provide: ElementRef, useClass: MockElementRef }, + DropdownService, + DropdownComponent + // Renderer2, + // ChangeDetectorRef + ] + }); + document = TestBed.inject(DOCUMENT); + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + elementRef = fixture.debugElement.query(By.directive(DropdownToggleDirective)); + dropdownRef = fixture.debugElement.query(By.directive(DropdownComponent)); + service = new DropdownService(); + + fixture.detectChanges(); // initial binding + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new DropdownToggleDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes and attributes', fakeAsync(() => { + expect(elementRef.nativeElement).not.toHaveClass('disabled'); + expect(elementRef.nativeElement).toHaveClass('dropdown-toggle'); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-toggle-split'); + component.variant = 'input-group'; + component.disabled = true; + component.split = true; + component.caret = false; + fixture.detectChanges(); + expect(elementRef.nativeElement).toHaveClass('disabled'); + expect(elementRef.nativeElement).not.toHaveClass('dropdown-toggle'); + expect(elementRef.nativeElement).toHaveClass('dropdown-toggle-split'); + expect(elementRef.nativeElement.getAttribute('aria-expanded')).toBe('false'); + component.variant = 'nav-item'; + component.visible = true; + fixture.detectChanges(); + expect(elementRef.nativeElement.getAttribute('aria-expanded')).toBe('true'); + })); + + it('should call event handling functions', fakeAsync(() => { + expect(component.visible).toBeFalse(); + elementRef.nativeElement.dispatchEvent(new MouseEvent('click')); + fixture.detectChanges(); + expect(component.visible).toBeTrue(); + elementRef.nativeElement.dispatchEvent(new MouseEvent('click')); + fixture.detectChanges(); + expect(component.visible).toBeFalse(); + elementRef.nativeElement.dispatchEvent(new MouseEvent('click')); + fixture.detectChanges(); + expect(component.visible).toBeTrue(); + dropdownRef.nativeElement.dispatchEvent(new KeyboardEvent('keyup', { key: 'Escape' })); + fixture.detectChanges(); + expect(component.visible).toBeFalse(); + component.visible = true; + fixture.detectChanges(); + document.dispatchEvent(new KeyboardEvent('keyup', { key: 'Tab' })); + fixture.detectChanges(); + expect(component.visible).toBeFalse(); + })); }); diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts index 0a6c5a3d..692856e0 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts @@ -1,32 +1,35 @@ +import { DOCUMENT } from '@angular/common'; import { - AfterContentInit, AfterViewInit, + booleanAttribute, ChangeDetectorRef, Component, - ContentChild, + computed, + contentChild, + DestroyRef, Directive, + effect, ElementRef, - EventEmitter, forwardRef, - HostBinding, - HostListener, - Inject, - Input, + inject, + input, + linkedSignal, NgZone, OnDestroy, OnInit, - Optional, - Output, - Renderer2 + output, + Renderer2, + signal, + untracked } from '@angular/core'; -import { DOCUMENT } from '@angular/common'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; -import { Subscription } from 'rxjs'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { filter } from 'rxjs/operators'; import { createPopper, Instance, Options, Placement } from '@popperjs/core'; -import { DropdownService } from '../dropdown.service'; +import { ThemeDirective } from '../../shared'; import { DropdownMenuDirective } from '../dropdown-menu/dropdown-menu.directive'; +import { DropdownService } from '../dropdown.service'; // lightweight injection token export abstract class DropdownToken {} @@ -34,162 +37,156 @@ export abstract class DropdownToken {} @Directive({ selector: '[cDropdownToggle]', providers: [{ provide: DropdownToken, useExisting: forwardRef(() => DropdownComponent) }], - exportAs: 'cDropdownToggle' + exportAs: 'cDropdownToggle', + host: { + '[class]': 'hostClasses()', + '[attr.aria-expanded]': 'ariaExpanded', + '(click)': 'onClick($event)' + } }) export class DropdownToggleDirective implements AfterViewInit { - - static ngAcceptInputType_split: BooleanInput; - static ngAcceptInputType_popper: BooleanInput; - - constructor( - public elementRef: ElementRef, - private dropdownService: DropdownService, - @Optional() public dropdown?: DropdownToken - ) {} + // injections + readonly #destroyRef = inject(DestroyRef); + public readonly elementRef = inject(ElementRef); + #dropdownService = inject(DropdownService); + public dropdown = inject(DropdownToken, { optional: true }); /** - * Toggle the disabled state for the toggler. - * @type DropdownComponent | undefined + * Reference to dropdown component. + * @return DropdownComponent | undefined * @default undefined */ - @Input() dropdownComponent?: DropdownComponent; + readonly dropdownComponent = input(); /** * Disables the toggler. - * @type boolean + * @return boolean * @default false */ - @Input() disabled?: boolean = false; + readonly disabled = input(false, { transform: booleanAttribute }); /** * Enables pseudo element caret on toggler. - * @type boolean + * @return boolean */ - @Input() caret = true; + readonly caret = input(true); /** - * Create split button dropdowns with virtually the same markup as single button dropdowns, but with the addition of `.dropdown-toggle-split` class for proper spacing around the dropdown caret. - * @type boolean + * Create split button dropdowns with virtually the same markup as single button dropdowns, + * but with the addition of `.dropdown-toggle-split` class for proper spacing around the dropdown caret. + * @return boolean + * @default false */ - @Input() - set split(value: boolean) { - this._split = coerceBooleanProperty(value); - } + readonly split = input(false, { transform: booleanAttribute }); - get split(): boolean { - return this._split; - } + readonly hostClasses = computed(() => { + return { + 'dropdown-toggle': this.caret(), + 'dropdown-toggle-split': this.split(), + disabled: this.disabled() + } as Record; + }); - private _split = false; + readonly #ariaExpanded = signal(false); - @HostBinding('class') - get hostClasses(): any { - return { - 'dropdown-toggle': this.caret, - 'dropdown-toggle-split': this.split, - disabled: this.disabled - }; + get ariaExpanded() { + return this.#ariaExpanded(); } - @HostListener('click', ['$event']) public onClick($event: MouseEvent): void { $event.preventDefault(); - !this.disabled && this.dropdownService.toggle({ visible: 'toggle', dropdown: this.dropdown }); + !this.disabled() && this.#dropdownService.toggle({ visible: 'toggle', dropdown: this.dropdown }); } ngAfterViewInit(): void { - if (this.dropdownComponent) { - this.dropdown = this.dropdownComponent; - this.dropdownService = this.dropdownComponent?.dropdownService; + const dropdownComponent = this.dropdownComponent(); + if (dropdownComponent) { + this.dropdown = dropdownComponent; + this.#dropdownService = dropdownComponent?.dropdownService; + } + if (this.dropdown) { + const dropdown = this.dropdown; + dropdown?.visibleChange?.subscribe((visible) => { + this.#ariaExpanded.set(visible); + }); } } } @Component({ selector: 'c-dropdown', - template: '', + template: '', styleUrls: ['./dropdown.component.scss'], exportAs: 'cDropdown', - providers: [DropdownService] + providers: [DropdownService], + hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }], + host: { + '[class]': 'hostClasses()', + '[style]': 'hostStyle()', + '(click)': 'onHostClick($event)' + } }) -export class DropdownComponent implements AfterContentInit, OnDestroy, OnInit { - - static ngAcceptInputType_dark: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; - - constructor( - @Inject(DOCUMENT) private document: Document, - private elementRef: ElementRef, - private renderer: Renderer2, - private ngZone: NgZone, - private changeDetectorRef: ChangeDetectorRef, - public dropdownService: DropdownService - ) {} +export class DropdownComponent implements OnDestroy, OnInit { + readonly #destroyRef = inject(DestroyRef); + readonly #document = inject(DOCUMENT); + readonly #elementRef = inject(ElementRef); + readonly #renderer = inject(Renderer2); + readonly #ngZone = inject(NgZone); + readonly #changeDetectorRef = inject(ChangeDetectorRef); + readonly dropdownService = inject(DropdownService); + + constructor() { + this.dropdownStateSubscribe(); + } /** * Set alignment of dropdown menu. - * @type {'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'}} + * @return {'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'}} */ - @Input() alignment?: string; - - @Input() autoClose: boolean | 'inside' | 'outside' = true; + readonly alignment = input(); /** - * Sets a darker color scheme to match a dark navbar. - * @type boolean - * @default false + * Automatically close dropdown when clicking outside the dropdown menu. */ - @Input() - set dark(value: boolean) { - this._dark = coerceBooleanProperty(value); - }; - - get dark() { - return this._dark; - } - - private _dark = false; + readonly autoClose = input(true); /** * Sets a specified direction and location of the dropdown menu. - * @type 'dropup' | 'dropend' | 'dropstart' + * @return 'dropup' | 'dropend' | 'dropstart' */ - @Input() direction?: 'center' | 'dropup' | 'dropup-center' | 'dropend' | 'dropstart'; + readonly direction = input<'center' | 'dropup' | 'dropup-center' | 'dropend' | 'dropstart'>(); /** - * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property. - * @type Placement + * Describes the placement of your component after Popper.js has applied all the modifiers + * that may have flipped or altered the originally provided placement property. + * @return Placement */ - @Input() placement: Placement = 'bottom-start'; + readonly placement = input('bottom-start'); /** * If you want to disable dynamic positioning set this property to `false`. - * @type boolean + * @return boolean * @default true */ - @Input() - set popper(value: boolean) { - this._popper = coerceBooleanProperty(value); - } - - get popper(): boolean { - return this._popper; - } - - private _popper = true; + readonly popper = input(true, { transform: booleanAttribute }); /** * Optional popper Options object, placement prop takes precedence over - * @type Partial + * @return Partial */ - @Input() + readonly popperOptionsInput = input>({}, { alias: 'popperOptions' }); + + readonly #popperOptionsEffect = effect(() => { + this.popperOptions = { ...untracked(this.#popperOptions), ...this.popperOptionsInput() }; + }); + set popperOptions(value: Partial) { - this._popperOptions = { ...this._popperOptions, ...value }; - }; + this.#popperOptions.update((popperOptions) => ({ ...popperOptions, ...value })); + } get popperOptions(): Partial { - let placement = this.placement; - switch (this.direction) { + let placement = this.placement(); + switch (this.direction()) { case 'dropup': { placement = 'top-start'; break; @@ -211,124 +208,118 @@ export class DropdownComponent implements AfterContentInit, OnDestroy, OnInit { break; } } - if (this.alignment === 'end') { + if (this.alignment() === 'end') { placement = 'bottom-end'; } - this._popperOptions = { ...this._popperOptions, placement: placement }; - return this._popperOptions; + this.#popperOptions.update((value) => ({ ...value, placement: placement })); + return this.#popperOptions(); } - private _popperOptions: Partial = { - placement: this.placement, + readonly #popperOptions = signal>({ + placement: this.placement(), modifiers: [], strategy: 'absolute' - }; + }); /** * Set the dropdown variant to a btn-group, dropdown, input-group, and nav-item. */ - @Input() variant?: 'btn-group' | 'dropdown' | 'input-group' | 'nav-item' = 'dropdown'; + readonly variant = input<('btn-group' | 'dropdown' | 'input-group' | 'nav-item') | undefined>('dropdown'); /** * Toggle the visibility of dropdown menu component. - * @type boolean + * @return boolean * @default false */ - @Input() - set visible(value: boolean) { - const _value = coerceBooleanProperty(value); - this.activeTrap = _value; - this._visible = _value; - _value ? this.createPopperInstance() : this.destroyPopperInstance(); - this.visibleChange.emit(_value); - } + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); - get visible(): boolean { - return this._visible; - } + readonly visible = linkedSignal({ + source: this.visibleInput, + computation: (value) => value + }); - private _visible = false; + readonly #visibleEffect = effect(() => { + const visible = this.visible(); + this.activeTrap = visible; + visible ? this.createPopperInstance() : this.destroyPopperInstance(); + this.setVisibleState(visible); + this.visibleChange.emit(visible); + }); - @Output() visibleChange: EventEmitter = new EventEmitter(); + readonly visibleChange = output(); - dropdownContext = { $implicit: this.visible }; - @ContentChild(DropdownToggleDirective) _toggler!: DropdownToggleDirective; - @ContentChild(DropdownMenuDirective) _menu!: DropdownMenuDirective; - @ContentChild(DropdownMenuDirective, { read: ElementRef }) _menuElementRef!: ElementRef; + dropdownContext = { $implicit: this.visible() }; + readonly _toggler = contentChild(DropdownToggleDirective); + readonly _menu = contentChild(DropdownMenuDirective); + readonly _menuElementRef = contentChild(DropdownMenuDirective, { read: ElementRef }); public activeTrap = false; - private dropdownStateSubscription!: Subscription; private popperInstance!: Instance | undefined; private listeners: (() => void)[] = []; - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const direction = this.direction(); + const variant = this.variant(); return { - dropdown: - (this.variant === 'dropdown' || this.variant === 'nav-item') && - !this.direction, - [`${this.direction}`]: !!this.direction, - [`${this.variant}`]: !!this.variant, - 'dropup': this.direction === 'dropup' || this.direction === 'dropup-center', - show: this.visible - }; - } + dropdown: (variant === 'dropdown' || variant === 'nav-item') && !direction, + [`${direction}`]: !!direction, + [`${variant}`]: !!variant, + dropup: direction === 'dropup' || direction === 'dropup-center', + show: this.visible() + } as Record; + }); // todo: find better solution - @HostBinding('style') - get hostStyle(): any { - return this.variant === 'input-group' ? { display: 'contents' } : {}; - } + readonly hostStyle = computed(() => { + return this.variant() === 'input-group' ? { display: 'contents' } : {}; + }); private clickedTarget!: HTMLElement; - @HostListener('click', ['$event']) - private onHostClick($event: MouseEvent): void { + onHostClick($event: MouseEvent): void { this.clickedTarget = $event.target as HTMLElement; } - dropdownStateSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.dropdownStateSubscription = - this.dropdownService.dropdownState$.subscribe((state) => { - if (this === state.dropdown) { - if ('visible' in state) { - state?.visible === 'toggle' - ? this.toggleDropdown() - : (this.visible = state.visible); - } - } - }); - } else { - this.dropdownStateSubscription.unsubscribe(); - } + dropdownStateSubscribe(): void { + this.dropdownService.dropdownState$ + .pipe( + filter((state) => { + return this === state.dropdown; + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe((state) => { + if ('visible' in state) { + state?.visible === 'toggle' ? this.toggleDropdown() : this.visible.set(state.visible); + } + }); } toggleDropdown(): void { - this.visible = !this.visible; + this.visible.update((visible) => !visible); } onClick(event: any): void { - if (!this._toggler?.elementRef.nativeElement.contains(event.target?.closest('[cDropdownToggle]'))) { + if (!this._toggler()?.elementRef.nativeElement.contains(event.target?.closest('[cDropdownToggle]'))) { this.toggleDropdown(); } } - ngAfterContentInit(): void { - if (this.variant === 'nav-item') { - this.renderer.addClass(this._toggler.elementRef.nativeElement, 'nav-link'); + readonly #togglerEffect = effect(() => { + const variant = this.variant(); + const _toggler = this._toggler(); + if (variant === 'nav-item' && _toggler) { + this.#renderer.addClass(_toggler.elementRef.nativeElement, 'nav-link'); } - } + }); ngOnInit(): void { - this.dropdownStateSubscribe(); - this.setVisibleState(this.visible); + this.setVisibleState(this.visible()); } ngOnDestroy(): void { this.clearListeners(); - this.dropdownStateSubscribe(false); this.destroyPopperInstance(); } @@ -338,22 +329,22 @@ export class DropdownComponent implements AfterContentInit, OnDestroy, OnInit { // todo: turn off popper in navbar-nav createPopperInstance(): void { - if (this._toggler && this._menu) { - this.ngZone.runOutsideAngular(() => { + const _toggler = this._toggler(); + const _menu = this._menu(); + if (_toggler && _menu) { + this.#ngZone.runOutsideAngular(() => { // workaround for popper position calculate (see also: dropdown-menu.component) - this._menu.elementRef.nativeElement.style.visibility = 'hidden'; - this._menu.elementRef.nativeElement.style.display = 'block'; - if (this.popper) { - this.popperInstance = createPopper( - this._toggler.elementRef.nativeElement, - this._menu.elementRef.nativeElement, - { ...this.popperOptions } - ); + _menu.elementRef.nativeElement.style.visibility = 'hidden'; + _menu.elementRef.nativeElement.style.display = 'block'; + if (this.popper()) { + this.popperInstance = createPopper(_toggler.elementRef.nativeElement, _menu.elementRef.nativeElement, { + ...this.popperOptions + }); } - this.ngZone.run(() => { + this.#ngZone.run(() => { this.setListeners(); - this.changeDetectorRef.markForCheck(); - this.changeDetectorRef.detectChanges(); + this.#changeDetectorRef.markForCheck(); + this.#changeDetectorRef.detectChanges(); }); }); } @@ -363,36 +354,37 @@ export class DropdownComponent implements AfterContentInit, OnDestroy, OnInit { this.clearListeners(); this.popperInstance?.destroy(); this.popperInstance = undefined; - this.changeDetectorRef.markForCheck(); + this.#changeDetectorRef.markForCheck(); } private setListeners(): void { this.listeners.push( - this.renderer.listen(this.document, 'click', (event) => { + this.#renderer.listen(this.#document, 'click', (event) => { const target = event.target as HTMLElement; - if (this._menuElementRef?.nativeElement.contains(event.target)) { + if (this._menuElementRef()?.nativeElement.contains(event.target)) { this.clickedTarget = target; } - if (this._toggler?.elementRef.nativeElement.contains(event.target)) { + if (this._toggler()?.elementRef.nativeElement.contains(event.target)) { return; } - if (this.autoClose === true) { + const autoClose = this.autoClose(); + if (autoClose === true) { this.setVisibleState(false); return; } - if (this.clickedTarget === target && this.autoClose === 'inside') { + if (this.clickedTarget === target && autoClose === 'inside') { this.setVisibleState(false); return; } - if (this.clickedTarget !== target && this.autoClose === 'outside') { + if (this.clickedTarget !== target && autoClose === 'outside') { this.setVisibleState(false); return; } }) ); this.listeners.push( - this.renderer.listen(this.elementRef.nativeElement, 'keyup', (event) => { - if (event.key === 'Escape' && this.autoClose !== false) { + this.#renderer.listen(this.#elementRef.nativeElement, 'keyup', (event) => { + if (event.key === 'Escape' && this.autoClose() !== false) { event.stopPropagation(); this.setVisibleState(false); return; @@ -400,8 +392,12 @@ export class DropdownComponent implements AfterContentInit, OnDestroy, OnInit { }) ); this.listeners.push( - this.renderer.listen(this.document, 'keyup', (event) => { - if (event.key === 'Tab' && this.autoClose !== false && !this.elementRef.nativeElement.contains(event.target)) { + this.#renderer.listen(this.#document, 'keyup', (event) => { + if ( + event.key === 'Tab' && + this.autoClose() !== false && + !this.#elementRef.nativeElement.contains(event.target) + ) { this.setVisibleState(false); return; } diff --git a/projects/coreui-angular/src/lib/footer/footer.component.spec.ts b/projects/coreui-angular/src/lib/footer/footer.component.spec.ts index 36089f15..eeb33507 100644 --- a/projects/coreui-angular/src/lib/footer/footer.component.spec.ts +++ b/projects/coreui-angular/src/lib/footer/footer.component.spec.ts @@ -8,9 +8,9 @@ describe('FooterComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ FooterComponent ] + imports: [FooterComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('FooterComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('footer'); + }); }); diff --git a/projects/coreui-angular/src/lib/footer/footer.component.ts b/projects/coreui-angular/src/lib/footer/footer.component.ts index 502e43b9..770daf1f 100644 --- a/projects/coreui-angular/src/lib/footer/footer.component.ts +++ b/projects/coreui-angular/src/lib/footer/footer.component.ts @@ -1,30 +1,34 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, computed, input, InputSignal } from '@angular/core'; import { Positions } from '../coreui.types'; @Component({ selector: 'c-footer, [cFooter]', - template: ``, + template: '', + host: { + class: 'footer', + '[class]': 'hostClasses()', + '[attr.role]': 'role()' + } }) export class FooterComponent { /** * Place footer in non-static positions. [docs] * @type Positions */ - @Input() position?: Positions; + readonly position: InputSignal = input(); + /** * Default role for footer. [docs] * @type string - * @default 'footer' + * @default 'contentinfo' */ - @Input() - @HostBinding('attr.role') role = 'footer'; + readonly role: InputSignal = input('contentinfo'); - @HostBinding('class') - get getClasses(): any { + readonly hostClasses = computed(() => { return { footer: true, - [`footer-${this.position}`]: !!this.position, - }; - } + [`footer-${this.position()}`]: !!this.position() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/footer/footer.module.ts b/projects/coreui-angular/src/lib/footer/footer.module.ts index 5163b43a..1f6c994e 100644 --- a/projects/coreui-angular/src/lib/footer/footer.module.ts +++ b/projects/coreui-angular/src/lib/footer/footer.module.ts @@ -1,17 +1,9 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { FooterComponent } from './footer.component'; @NgModule({ - declarations: [ - FooterComponent - ], - imports: [ - CommonModule - ], - exports: [ - FooterComponent - ] + imports: [FooterComponent], + exports: [FooterComponent] }) -export class FooterModule { } +export class FooterModule {} diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts index 992634f1..3a029d53 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts @@ -1,31 +1,50 @@ -import { Component, DebugElement, Renderer2, Type } from '@angular/core'; +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { FormCheckInputDirective } from './form-check-input.directive'; +class MockElementRef extends ElementRef {} + @Component({ - template: `` + template: '', + imports: [FormCheckInputDirective] }) -class TestComponent {} +class TestComponent { + indeterminate = false; +} describe('FormCheckInputDirective', () => { let component: TestComponent; let fixture: ComponentFixture; let inputEl: DebugElement; - let renderer: Renderer2; + // let renderer: Renderer2; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [TestComponent, FormCheckInputDirective] - }); + imports: [FormCheckInputDirective, TestComponent], + providers: [Renderer2, { provide: ElementRef, useClass: MockElementRef }] + }).compileComponents(); fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; - inputEl = fixture.debugElement.query(By.css('input')); - renderer = fixture.componentRef.injector.get(Renderer2 as Type); + inputEl = fixture.debugElement.query(By.directive(FormCheckInputDirective)); + fixture.detectChanges(); }); it('should create an instance', () => { - const directive = new FormCheckInputDirective(renderer, inputEl); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new FormCheckInputDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(inputEl.nativeElement).toHaveClass('form-check-input'); + }); + + it('should have indeterminate state', () => { + component.indeterminate = true; + fixture.detectChanges(); + expect(inputEl.nativeElement.checked).toBeFalse(); + expect(inputEl.nativeElement.indeterminate).toBeTrue(); }); }); diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts index 47c1aa6b..76aceb30 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts @@ -1,60 +1,75 @@ -import { Directive, ElementRef, HostBinding, Input, Renderer2 } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + booleanAttribute, + computed, + Directive, + effect, + ElementRef, + inject, + input, + linkedSignal, + Renderer2 +} from '@angular/core'; +import { BooleanInput } from '@angular/cdk/coercion'; @Directive({ - selector: 'input[cFormCheckInput]' + selector: 'input[cFormCheckInput]', + host: { + class: 'form-check-input', + '[class]': 'hostClasses()', + '[attr.type]': 'type()' + } }) export class FormCheckInputDirective { - static ngAcceptInputType_indeterminate: BooleanInput; + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + /** * Specifies the type of component. - * @type {'checkbox' | 'radio'} * @default 'checkbox' */ - @HostBinding('attr.type') - @Input() type: ('checkbox' | 'radio') = 'checkbox'; + readonly type = input<'checkbox' | 'radio'>('checkbox'); /** * Set component indeterminate state. - * @type boolean + * @default false */ - @Input() - set indeterminate(value: boolean) { - const newValue = coerceBooleanProperty(value); - if (this._indeterminate !== newValue) { - this._indeterminate = newValue; - this.renderer.setProperty(this.hostElement.nativeElement, 'indeterminate', newValue); + readonly indeterminateInput = input(false, { transform: booleanAttribute, alias: 'indeterminate' }); + + readonly #indeterminate = linkedSignal(this.indeterminateInput); + + readonly #indeterminateEffect = effect(() => { + if (this.type() === 'checkbox') { + const indeterminate = this.#indeterminate(); + const htmlInputElement = this.#hostElement.nativeElement as HTMLInputElement; + if (indeterminate) { + this.#renderer.setProperty(htmlInputElement, 'checked', false); + } + this.#renderer.setProperty(htmlInputElement, 'indeterminate', indeterminate); } - }; + }); + get indeterminate() { - return this._indeterminate; + return this.#indeterminate(); } - private _indeterminate = false; /** * Set component validation state to valid. - * @type boolean + * @default undefined */ - @Input() valid?: boolean; + readonly valid = input(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const valid = this.valid(); return { 'form-check-input': true, - 'is-valid': this.valid === true, - 'is-invalid': this.valid === false - }; - } + 'is-valid': valid === true, + 'is-invalid': valid === false + } as Record; + }); get checked(): boolean { - return this.hostElement?.nativeElement?.checked; + return this.#hostElement?.nativeElement?.checked; } - - constructor( - private renderer: Renderer2, - private hostElement: ElementRef - ) { } - } diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.spec.ts b/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.spec.ts index 2ebc6583..f5af4330 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.spec.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.spec.ts @@ -1,8 +1,33 @@ import { FormCheckLabelDirective } from './form-check-label.directive'; +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +@Component({ + template: '', + imports: [FormCheckLabelDirective] +}) +class TestComponent {} describe('FormCheckLabelDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }); + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(FormCheckLabelDirective)); + }); + it('should create an instance', () => { const directive = new FormCheckLabelDirective(); expect(directive).toBeTruthy(); }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('form-check-label'); + }); }); diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.ts b/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.ts index f64222e1..f3c30eab 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check-label.directive.ts @@ -1,16 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: 'label[cFormCheckLabel]' + selector: 'label[cFormCheckLabel]', + host: { class: 'form-check-label' } }) -export class FormCheckLabelDirective { - - @HostBinding('class') - get hostClasses(): any { - - return { - 'form-check-label': true, - }; - } - -} +export class FormCheckLabelDirective {} diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check.component.spec.ts b/projects/coreui-angular/src/lib/form/form-check/form-check.component.spec.ts index 02db2be9..fc5d48af 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check.component.spec.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check.component.spec.ts @@ -1,29 +1,78 @@ +import { Component, ComponentRef, DebugElement } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - import { FormCheckComponent } from './form-check.component'; -import { Renderer2 } from '@angular/core'; +import { FormCheckInputDirective } from './form-check-input.directive'; +import { FormCheckLabelDirective } from './form-check-label.directive'; +import { By } from '@angular/platform-browser'; + +@Component({ + template: ` + + + + + `, + imports: [FormCheckInputDirective, FormCheckComponent, FormCheckLabelDirective] +}) +class TestComponent { + inline = true; + reverse = true; + switch = false; +} describe('FormCheckComponent', () => { let component: FormCheckComponent; let fixture: ComponentFixture; - let renderer: Renderer2; + let componentRef: ComponentRef; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FormCheckComponent], - providers: [Renderer2] - }) - .compileComponents(); - })); + imports: [FormCheckComponent] + }).compileComponents(); - beforeEach(() => { fixture = TestBed.createComponent(FormCheckComponent); - renderer = fixture.debugElement.injector.get(Renderer2); component = fixture.componentInstance; + componentRef = fixture.componentRef; + componentRef.setInput('switch', true); fixture.detectChanges(); - }); + })); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('form-switch'); + expect(fixture.nativeElement).not.toHaveClass('form-check'); + }); +}); + +describe('FormCheckComponent Test', () => { + let testFixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + testFixture = TestBed.createComponent(TestComponent); + debugElement = testFixture.debugElement.query(By.directive(FormCheckComponent)); + testFixture.detectChanges(); // initial binding + })); + + it('should have css classes', () => { + expect(debugElement.nativeElement).not.toHaveClass('form-switch'); + expect(debugElement.nativeElement).not.toHaveClass('form-switch-xl'); + expect(debugElement.nativeElement).toHaveClass('form-check-inline'); + expect(debugElement.nativeElement).toHaveClass('form-check-reverse'); + testFixture.componentInstance.switch = true; + testFixture.componentInstance.inline = false; + testFixture.componentInstance.reverse = false; + testFixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('form-switch'); + expect(debugElement.nativeElement).toHaveClass('form-switch-xl'); + expect(debugElement.nativeElement).not.toHaveClass('form-check-inline'); + expect(debugElement.nativeElement).not.toHaveClass('form-check-reverse'); + expect(debugElement.nativeElement).toHaveClass('form-check'); + }); }); diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts b/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts index 8365accc..005b0a73 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts @@ -1,70 +1,56 @@ -import { AfterContentInit, Component, ContentChild, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; - +import { BooleanInput } from '@angular/cdk/coercion'; +import { booleanAttribute, Component, computed, contentChild, input } from '@angular/core'; import { FormCheckLabelDirective } from './form-check-label.directive'; @Component({ selector: 'c-form-check', - template: '', - exportAs: 'cFormCheck' + template: '', + exportAs: 'cFormCheck', + host: { '[class]': 'hostClasses()' } }) -export class FormCheckComponent implements AfterContentInit { - +export class FormCheckComponent { static ngAcceptInputType_inline: BooleanInput; + static ngAcceptInputType_reverse: BooleanInput; static ngAcceptInputType_switch: BooleanInput; - private _inline = false; /** * Group checkboxes or radios on the same horizontal row. - * @type boolean * @default false */ - @Input() - set inline(value: boolean) { - this._inline = coerceBooleanProperty(value); - } - get inline(): boolean { - return this._inline; - } + readonly inline = input(false, { transform: booleanAttribute }); + + /** + * Put checkboxes or radios on the opposite side. + * @default false + * @since 4.4.7 + */ + readonly reverse = input(false, { transform: booleanAttribute }); /** * Size the component large or extra large. Works only with `[switch]="true"` [docs] - * @type {'lg' | 'xl' | ''} + * @default undefined */ - @Input() sizing?: 'lg' | 'xl' | '' = ''; + readonly sizing = input<'' | 'lg' | 'xl' | string>(); - /** + /** * Render a toggle switch on for checkbox. - * @type boolean + * @returns boolean * @default false */ - @Input() - set switch(value: boolean) { - this._switch = coerceBooleanProperty(value); - } - get switch(): boolean { - return this._switch; - } - private _switch = false; + readonly switch = input(false, { transform: booleanAttribute }); - @HostBinding('class') - get hostClasses(): any { + readonly formCheckLabel = contentChild(FormCheckLabelDirective); - return { - 'form-check': this.formCheckClass, - 'form-switch': this.switch, - [`form-switch-${this.sizing}`]: this.switch && !!this.sizing, - 'form-check-inline': this.inline - }; - } + readonly hostClasses = computed(() => { + const sizing = this.sizing(); + const isSwitch = this.switch(); - @ContentChild(FormCheckLabelDirective) formCheckLabel!: FormCheckLabelDirective; - private _formCheckClass = true; - get formCheckClass() { - return this._formCheckClass; - } - - ngAfterContentInit(): void { - this._formCheckClass = !!this.formCheckLabel; - } + return { + 'form-check': !!this.formCheckLabel(), + 'form-switch': isSwitch, + [`form-switch-${sizing}`]: isSwitch && !!sizing, + 'form-check-inline': this.inline(), + 'form-check-reverse': this.reverse() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/form/form-control/form-control.directive.spec.ts b/projects/coreui-angular/src/lib/form/form-control/form-control.directive.spec.ts index d28c11ed..75114418 100644 --- a/projects/coreui-angular/src/lib/form/form-control/form-control.directive.spec.ts +++ b/projects/coreui-angular/src/lib/form/form-control/form-control.directive.spec.ts @@ -1,10 +1,17 @@ -import { ElementRef } from '@angular/core'; import { FormControlDirective } from './form-control.directive'; +import { TestBed } from '@angular/core/testing'; +import { ElementRef } from '@angular/core'; + +class MockElementRef extends ElementRef {} describe('FormControlDirective', () => { - let hostElement: ElementRef; it('should create an instance', () => { - const directive = new FormControlDirective(hostElement); - expect(directive).toBeTruthy(); + TestBed.configureTestingModule({ + providers: [{ provide: ElementRef, useClass: MockElementRef }] + }); + TestBed.runInInjectionContext(() => { + const directive = new FormControlDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/form/form-control/form-control.directive.ts b/projects/coreui-angular/src/lib/form/form-control/form-control.directive.ts index 38e32e84..42d118d0 100644 --- a/projects/coreui-angular/src/lib/form/form-control/form-control.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-control/form-control.directive.ts @@ -1,72 +1,66 @@ -import { Directive, ElementRef, HostBinding, Input, OnInit } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, computed, Directive, ElementRef, inject, input, OnInit } from '@angular/core'; import { InputType } from '../../coreui.types'; @Directive({ - selector: 'input[cFormControl], textarea[cFormControl]' + selector: 'input[cFormControl], textarea[cFormControl]', + host: { + '[class]': 'hostClasses()', + '[attr.type]': 'type()' + } }) export class FormControlDirective implements OnInit { + readonly #hostElement = inject(ElementRef); - static ngAcceptInputType_plaintext: BooleanInput; /** * Size the component small or large. - * @type {'sm' | 'lg'} + * @default undefined */ - @Input() sizing?: '' | 'sm' | 'lg' | string = ''; + readonly sizing = input<'' | 'sm' | 'lg' | string>(); + /** * Set component validation state to valid. - * @type boolean + * @default undefined */ - @Input() valid?: boolean; + readonly valid = input(); /** * Specifies the type of input element. */ - @HostBinding('attr.type') - @Input() type: Omit = 'text'; + readonly type = input>('text'); /** - * Render the component styled as plain text. Removes the default form field styling and preserve the correct margin and padding. Recommend to use alongside `readonly` [docs] + * Render the component styled as plain text. Removes the default form field styling and preserve the correct margin and padding. Recommend to use alongside `readonly` + * @default false */ - @Input() - set plaintext(value: boolean) { - this._plaintext = coerceBooleanProperty(value); - } - get plaintext(): boolean { - return this._plaintext; - } - private _plaintext = false; + readonly plaintext = input(false, { transform: booleanAttribute }); - constructor( - private hostElement: ElementRef - ) {} - - @HostBinding('class') - get hostClasses(): any { - - const isRangeType = this.type === 'range'; + readonly hostClasses = computed(() => { + const type = this.type(); + const isRange = type === 'range'; + const plaintext = this.plaintext(); + const sizing = this.sizing(); + const valid = this.valid(); return { - 'form-control': !isRangeType && !this.plaintext, - 'form-control-plaintext': !isRangeType && this.plaintext, - 'form-control-color': this.type === 'color', - 'form-range': isRangeType, - [`form-control-${this.sizing}`]: !!this.sizing && !isRangeType, - 'is-valid': this.valid === true, - 'is-invalid': this.valid === false - }; - } + 'form-control': !isRange && !plaintext, + 'form-control-plaintext': !isRange && plaintext, + 'form-control-color': type === 'color', + 'form-range': isRange, + [`form-control-${sizing}`]: !!sizing && !isRange, + 'is-valid': valid === true, + 'is-invalid': valid === false + } as Record; + }); get hostTag(): string { - return this.hostElement.nativeElement.tagName; + return this.#hostElement.nativeElement.tagName; } ngOnInit(): void { const hostTag = this.hostTag.toLowerCase(); if (hostTag !== 'input' && hostTag !== 'textarea') { - console.warn(`CoreUI [cFormControl] works with '' and '' - not with '<${hostTag}>'`); + console.warn(`CoreUI [cFormControl] works with '' and ' + + + ` +}) +class TestComponent { + readonly floating = input(false); +} describe('FormFloatingDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + let componentRef: ComponentRef; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + debugElement = fixture.debugElement.query(By.directive(FormFloatingDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new FormFloatingDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new FormFloatingDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).not.toHaveClass('form-floating'); + componentRef.setInput('floating', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('form-floating'); + componentRef.setInput('floating', false); + fixture.detectChanges(); + expect(debugElement.nativeElement).not.toHaveClass('form-floating'); }); }); diff --git a/projects/coreui-angular/src/lib/form/form-floating/form-floating.directive.ts b/projects/coreui-angular/src/lib/form/form-floating/form-floating.directive.ts index b9fa4db1..79d276ba 100644 --- a/projects/coreui-angular/src/lib/form/form-floating/form-floating.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-floating/form-floating.directive.ts @@ -1,33 +1,13 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Directive, input } from '@angular/core'; @Directive({ - selector: '[cFormFloating]' + selector: '[cFormFloating]', + host: { '[class.form-floating]': 'floating()' } }) export class FormFloatingDirective { - - static ngAcceptInputType_floating: BooleanInput; - /** * Enable floating labels * @type boolean */ - @Input('cFormFloating') - get floating(): boolean { - return this._floating; - } - set floating(value: boolean) { - this._floating = coerceBooleanProperty(value); - } - private _floating = true; - - @HostBinding('class') - get hostClasses(): any { - return { - 'form-floating': this.floating, - }; - } - - constructor() { } - + readonly floating = input(true, { transform: booleanAttribute, alias: 'cFormFloating' }); } diff --git a/projects/coreui-angular/src/lib/form/form-label/form-label.directive.spec.ts b/projects/coreui-angular/src/lib/form/form-label/form-label.directive.spec.ts index b993759a..94ba1c23 100644 --- a/projects/coreui-angular/src/lib/form/form-label/form-label.directive.spec.ts +++ b/projects/coreui-angular/src/lib/form/form-label/form-label.directive.spec.ts @@ -1,8 +1,11 @@ import { FormLabelDirective } from './form-label.directive'; +import { TestBed } from '@angular/core/testing'; describe('LabelDirective', () => { it('should create an instance', () => { - const directive = new FormLabelDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new FormLabelDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/form/form-label/form-label.directive.ts b/projects/coreui-angular/src/lib/form/form-label/form-label.directive.ts index bb56e65a..0f520989 100644 --- a/projects/coreui-angular/src/lib/form/form-label/form-label.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-label/form-label.directive.ts @@ -1,30 +1,28 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; @Directive({ - selector: '[cLabel]' + selector: '[cLabel]', + host: { class: 'form-label', '[class]': 'hostClasses()' } }) export class FormLabelDirective { - /** * For horizontal forms set labels to 'col' and make them vertically centered with their associated form controls. - * @type 'col' + * @default '' */ - @Input('cLabel') col: 'col' | '' = ''; + readonly col = input<'col' | ''>('', { alias: 'cLabel' }); /** * Size the label small or large. + * @default '' */ - @Input() sizing: '' | 'sm' | 'lg' | string = ''; - - @HostBinding('class') - get hostClasses(): any { + readonly sizing = input<'' | 'sm' | 'lg' | string>(); + readonly hostClasses = computed(() => { + const col = this.col(); + const sizing = this.sizing(); return { 'form-label': true, - 'col-form-label': this.col === 'col', - [`col-form-label-${this.sizing}`]: !!this.sizing && this.col === 'col', - }; - } - - constructor() {} - + 'col-form-label': col === 'col', + [`col-form-label-${sizing}`]: !!sizing && col === 'col' + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/form/form-select/form-select.directive.spec.ts b/projects/coreui-angular/src/lib/form/form-select/form-select.directive.spec.ts index ddec0519..2e2fb46f 100644 --- a/projects/coreui-angular/src/lib/form/form-select/form-select.directive.spec.ts +++ b/projects/coreui-angular/src/lib/form/form-select/form-select.directive.spec.ts @@ -1,8 +1,67 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, ComponentRef, DebugElement, input } from '@angular/core'; import { FormSelectDirective } from './form-select.directive'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [FormSelectDirective], + template: ` ` +}) +class TestComponent { + readonly sizing = input<'' | 'sm' | 'lg' | string>(); + readonly valid = input(); +} describe('FormSelectDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + let componentRef: ComponentRef; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + debugElement = fixture.debugElement.query(By.directive(FormSelectDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new FormSelectDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new FormSelectDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('form-select'); + componentRef.setInput('sizing', 'sm'); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('form-select-sm'); + componentRef.setInput('sizing', 'lg'); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('form-select-lg'); + componentRef.setInput('sizing', ''); + fixture.detectChanges(); + expect(debugElement.nativeElement).not.toHaveClass('form-select-sm'); + expect(debugElement.nativeElement).not.toHaveClass('form-select-lg'); + expect(debugElement.nativeElement).not.toHaveClass('is-invalid'); + expect(debugElement.nativeElement).not.toHaveClass('is-valid'); + componentRef.setInput('valid', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).not.toHaveClass('is-invalid'); + expect(debugElement.nativeElement).toHaveClass('is-valid'); + componentRef.setInput('valid', false); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('is-invalid'); + expect(debugElement.nativeElement).not.toHaveClass('is-valid'); + componentRef.setInput('valid', undefined); + fixture.detectChanges(); + expect(debugElement.nativeElement).not.toHaveClass('is-invalid'); + expect(debugElement.nativeElement).not.toHaveClass('is-valid'); }); }); diff --git a/projects/coreui-angular/src/lib/form/form-select/form-select.directive.ts b/projects/coreui-angular/src/lib/form/form-select/form-select.directive.ts index 0f34101a..5530df29 100644 --- a/projects/coreui-angular/src/lib/form/form-select/form-select.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-select/form-select.directive.ts @@ -1,30 +1,30 @@ -import { Directive, HostBinding, Input, OnChanges } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; @Directive({ - selector: 'select[cSelect]' + selector: 'select[cSelect]', + host: { class: 'form-select', '[class]': 'hostClasses()' } }) export class FormSelectDirective { /** * Size the component small or large. + * @default undefined */ - @Input() sizing?: '' | 'sm' | 'lg' | string = ''; + readonly sizing = input<'' | 'sm' | 'lg' | string>(); /** * Set component validation state to valid. - * @type {boolean | undefined} + * @default undefined */ - @Input() valid?: boolean; + readonly valid = input(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const sizing = this.sizing(); + const valid = this.valid(); return { 'form-select': true, - [`form-select-${this.sizing}`]: !!this.sizing, - 'is-valid': this.valid === true, - 'is-invalid': this.valid === false, - }; - } - - constructor() {} - + [`form-select-${sizing}`]: !!sizing, + 'is-valid': valid === true, + 'is-invalid': valid === false + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/form/form-text/form-text.directive.ts b/projects/coreui-angular/src/lib/form/form-text/form-text.directive.ts index f794186e..bc1c3255 100644 --- a/projects/coreui-angular/src/lib/form/form-text/form-text.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-text/form-text.directive.ts @@ -1,16 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cFormText]' + selector: '[cFormText]', + host: { class: 'form-text' } }) -export class FormTextDirective { - - @HostBinding('class') - get hostClasses(): any { - return { - 'form-text': true, - }; - } - - constructor() { } -} +export class FormTextDirective {} diff --git a/projects/coreui-angular/src/lib/form/form.module.ts b/projects/coreui-angular/src/lib/form/form.module.ts index 9afb17c6..1ab71add 100644 --- a/projects/coreui-angular/src/lib/form/form.module.ts +++ b/projects/coreui-angular/src/lib/form/form.module.ts @@ -1,5 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { FormDirective } from './form/form.directive'; import { FormFeedbackComponent } from './form-feedback/form-feedback.component'; import { InputGroupComponent } from './input-group/input-group.component'; @@ -14,9 +13,11 @@ import { FormCheckLabelDirective } from './form-check/form-check-label.directive import { FormCheckInputDirective } from './form-check/form-check-input.directive'; @NgModule({ - declarations: [ + imports: [ FormDirective, FormCheckComponent, + FormCheckLabelDirective, + FormCheckInputDirective, FormControlDirective, FormFeedbackComponent, FormFloatingDirective, @@ -24,14 +25,13 @@ import { FormCheckInputDirective } from './form-check/form-check-input.directive FormSelectDirective, FormTextDirective, InputGroupComponent, - InputGroupTextDirective, - FormCheckLabelDirective, - FormCheckInputDirective, + InputGroupTextDirective ], - imports: [CommonModule], exports: [ FormDirective, FormCheckComponent, + FormCheckLabelDirective, + FormCheckInputDirective, FormControlDirective, FormFeedbackComponent, FormFloatingDirective, @@ -39,9 +39,7 @@ import { FormCheckInputDirective } from './form-check/form-check-input.directive FormSelectDirective, FormTextDirective, InputGroupComponent, - InputGroupTextDirective, - FormCheckLabelDirective, - FormCheckInputDirective + InputGroupTextDirective ] }) export class FormModule {} diff --git a/projects/coreui-angular/src/lib/form/form/form.directive.spec.ts b/projects/coreui-angular/src/lib/form/form/form.directive.spec.ts index 540defde..f6004cd4 100644 --- a/projects/coreui-angular/src/lib/form/form/form.directive.spec.ts +++ b/projects/coreui-angular/src/lib/form/form/form.directive.spec.ts @@ -1,8 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, ComponentRef, DebugElement, input } from '@angular/core'; +import { By } from '@angular/platform-browser'; import { FormDirective } from './form.directive'; +@Component({ + imports: [FormDirective], + template: '
' +}) +class TestComponent { + readonly validated = input(false); +} + describe('FormDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + let componentRef: ComponentRef; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + debugElement = fixture.debugElement.query(By.directive(FormDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new FormDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new FormDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).not.toHaveClass('was-validated'); + componentRef.setInput('validated', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('was-validated'); + componentRef.setInput('validated', false); + fixture.detectChanges(); + expect(debugElement.nativeElement).not.toHaveClass('was-validated'); }); }); diff --git a/projects/coreui-angular/src/lib/form/form/form.directive.ts b/projects/coreui-angular/src/lib/form/form/form.directive.ts index ff29e4b3..250a1b6b 100644 --- a/projects/coreui-angular/src/lib/form/form/form.directive.ts +++ b/projects/coreui-angular/src/lib/form/form/form.directive.ts @@ -1,33 +1,14 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Directive, input } from '@angular/core'; @Directive({ - selector: 'form[cForm]' + selector: 'form[cForm]', + host: { '[class.was-validated]': 'validated()' } }) export class FormDirective { - - static ngAcceptInputType_validated: BooleanInput; - private _validated = false; - /** * Mark a form as validated. If you set it `true`, all validation styles will be applied to the form. [docs] - * @type boolean + * @return boolean * @default false */ - @Input() - set validated(value: boolean) { - this._validated = coerceBooleanProperty(value); - } - get validated() { - return this._validated; - } - - @HostBinding('class') - get hostClasses(): any { - return { - 'was-validated': this.validated, - }; - } - - constructor() { } + readonly validated = input(false, { transform: booleanAttribute }); } diff --git a/projects/coreui-angular/src/lib/form/input-group-text/input-group-text.directive.ts b/projects/coreui-angular/src/lib/form/input-group-text/input-group-text.directive.ts index 78742614..0fe35d2e 100644 --- a/projects/coreui-angular/src/lib/form/input-group-text/input-group-text.directive.ts +++ b/projects/coreui-angular/src/lib/form/input-group-text/input-group-text.directive.ts @@ -1,17 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cInputGroupText]' + selector: '[cInputGroupText]', + host: { class: 'input-group-text' } }) -export class InputGroupTextDirective { - - @HostBinding('class') - get hostClasses(): any { - return { - 'input-group-text': true, - }; - } - - constructor() { } - -} +export class InputGroupTextDirective {} diff --git a/projects/coreui-angular/src/lib/form/input-group/input-group.component.spec.ts b/projects/coreui-angular/src/lib/form/input-group/input-group.component.spec.ts index 04837698..ad3d2c80 100644 --- a/projects/coreui-angular/src/lib/form/input-group/input-group.component.spec.ts +++ b/projects/coreui-angular/src/lib/form/input-group/input-group.component.spec.ts @@ -8,9 +8,9 @@ describe('InputGroupComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ InputGroupComponent ] + imports: [InputGroupComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('InputGroupComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('input-group'); + }); }); diff --git a/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts b/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts index 9c7c4905..9b27436f 100644 --- a/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts +++ b/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts @@ -1,27 +1,21 @@ -import { - Component, - HostBinding, - Input, -} from '@angular/core'; +import { Component, computed, input } from '@angular/core'; @Component({ selector: 'c-input-group', - template: ``, + template: '', + host: { class: 'input-group', '[class]': 'hostClasses()' } }) export class InputGroupComponent { /** * Size the component small or large. */ - @Input() sizing: string | 'sm' | 'lg' | '' = ''; + readonly sizing = input(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const sizing = this.sizing(); return { 'input-group': true, - [`input-group-${this.sizing}`]: !!this.sizing, - }; - } - - constructor() {} - + [`input-group-${sizing}`]: !!sizing + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/grid/col.component.spec.ts b/projects/coreui-angular/src/lib/grid/col.component.spec.ts index b7647f57..2f9dab86 100644 --- a/projects/coreui-angular/src/lib/grid/col.component.spec.ts +++ b/projects/coreui-angular/src/lib/grid/col.component.spec.ts @@ -8,9 +8,9 @@ describe('ColComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ColComponent ] + imports: [ColComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ColComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('col'); + }); }); diff --git a/projects/coreui-angular/src/lib/grid/col.component.ts b/projects/coreui-angular/src/lib/grid/col.component.ts index a59f9c32..528fc075 100644 --- a/projects/coreui-angular/src/lib/grid/col.component.ts +++ b/projects/coreui-angular/src/lib/grid/col.component.ts @@ -4,7 +4,7 @@ import { ColDirective } from './col.directive'; @Component({ selector: 'c-col', - template: '', - styleUrls: ['./col.component.scss'], + template: '', + styleUrls: ['./col.component.scss'] }) export class ColComponent extends ColDirective {} diff --git a/projects/coreui-angular/src/lib/grid/col.directive.spec.ts b/projects/coreui-angular/src/lib/grid/col.directive.spec.ts index dd3c940e..75ea63c6 100644 --- a/projects/coreui-angular/src/lib/grid/col.directive.spec.ts +++ b/projects/coreui-angular/src/lib/grid/col.directive.spec.ts @@ -1,8 +1,60 @@ -import { ColDirective } from './col.directive'; +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { ColDirective, ColOffsetType, ColOrderType } from './col.directive'; + +@Component({ + imports: [ColDirective], + template: ` +
+
+
+ ` +}) +export class TestComponent { + col!: number; + offset: ColOffsetType = { md: 2, xs: 1 }; + order: ColOrderType = { xl: 'first', xxl: 'last', md: 1, xs: 1 }; +} describe('ColDirective', () => { + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }); + fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new ColDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ColDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css class', () => { + debugElement = fixture.debugElement.query(By.css('#col0')); + expect(debugElement.nativeElement).toHaveClass('col'); + expect(debugElement.nativeElement).toHaveClass('col-lg-auto'); + expect(debugElement.nativeElement).toHaveClass('col-xl'); + debugElement = fixture.debugElement.query(By.css('#col1')); + expect(debugElement.nativeElement).toHaveClass('col-6'); + expect(debugElement.nativeElement).toHaveClass('order-1'); + expect(debugElement.nativeElement).toHaveClass('offset-1'); + expect(debugElement.nativeElement).toHaveClass('col-sm-5'); + expect(debugElement.nativeElement).toHaveClass('col-md-4'); + expect(debugElement.nativeElement).toHaveClass('col-lg-3'); + expect(debugElement.nativeElement).toHaveClass('col-xl-2'); + expect(debugElement.nativeElement).toHaveClass('col-xxl-1'); + debugElement = fixture.debugElement.query(By.css('#col2')); + expect(debugElement.nativeElement).toHaveClass('col'); + expect(debugElement.nativeElement).toHaveClass('offset-md-2'); + expect(debugElement.nativeElement).toHaveClass('order-md-1'); + expect(debugElement.nativeElement).toHaveClass('order-xl-first'); + expect(debugElement.nativeElement).toHaveClass('order-xxl-last'); }); }); diff --git a/projects/coreui-angular/src/lib/grid/col.directive.ts b/projects/coreui-angular/src/lib/grid/col.directive.ts index 22f39149..0657307b 100644 --- a/projects/coreui-angular/src/lib/grid/col.directive.ts +++ b/projects/coreui-angular/src/lib/grid/col.directive.ts @@ -1,159 +1,135 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty, coerceNumberProperty, NumberInput } from '@angular/cdk/coercion'; - -import { ColOrder, ICol } from './col.type'; +import { booleanAttribute, computed, Directive, input, numberAttribute } from '@angular/core'; +import { BooleanInput, NumberInput } from '@angular/cdk/coercion'; import { BreakpointInfix } from '../coreui.types'; +import { ColOrder } from './col.type'; + +export type ColOffsetType = number | { xs?: number; sm?: number; md?: number; lg?: number; xl?: number; xxl?: number }; +export type ColOrderType = + | ColOrder + | { xs?: ColOrder; sm?: ColOrder; md?: ColOrder; lg?: ColOrder; xl?: ColOrder; xxl?: ColOrder }; @Directive({ - selector: '[cCol]' + selector: '[cCol]', + host: { + '[class]': 'hostClasses()' + } }) -export class ColDirective implements ICol { - - static ngAcceptInputType_cCol: (BooleanInput | NumberInput); - static ngAcceptInputType_xs: (BooleanInput | NumberInput); - static ngAcceptInputType_sm: (BooleanInput | NumberInput); - static ngAcceptInputType_md: (BooleanInput | NumberInput); - static ngAcceptInputType_lg: (BooleanInput | NumberInput); - static ngAcceptInputType_xl: (BooleanInput | NumberInput); - static ngAcceptInputType_xxl: (BooleanInput | NumberInput); +export class ColDirective { + static ngAcceptInputType_cCol: BooleanInput | NumberInput; + static ngAcceptInputType_xs: BooleanInput | NumberInput; + static ngAcceptInputType_sm: BooleanInput | NumberInput; + static ngAcceptInputType_md: BooleanInput | NumberInput; + static ngAcceptInputType_lg: BooleanInput | NumberInput; + static ngAcceptInputType_xl: BooleanInput | NumberInput; + static ngAcceptInputType_xxl: BooleanInput | NumberInput; /** * The number of columns/offset/order on extra small devices (<576px). - * @type { 'auto' | number | boolean } + * @return { 'auto' | number | boolean } */ - @Input() - set cCol(value: (BooleanInput | NumberInput)) { - this.xs = this.xs || this.coerceInput(value); - } - @Input() - set xs(value) { - this._xs = this.coerceInput(value); - } - get xs(): (BooleanInput | NumberInput) { - return this._xs; - } - private _xs: (BooleanInput | NumberInput) = false; + readonly cCol = input(false, { transform: this.coerceInput }); + readonly xs = input(false, { transform: this.coerceInput }); /** * The number of columns/offset/order on small devices (<768px). - * @type { 'auto' | number | boolean } + * @return { 'auto' | number | boolean } */ - @Input() - set sm(value) { - this._sm = this.coerceInput(value); - } - get sm(): (BooleanInput | NumberInput) { - return this._sm; - } - private _sm: (BooleanInput | NumberInput) = false; + readonly sm = input(false, { transform: this.coerceInput }); /** * The number of columns/offset/order on medium devices (<992px). - * @type { 'auto' | number | boolean } + * @return { 'auto' | number | boolean } */ - @Input() - set md(value) { - this._md = this.coerceInput(value); - } - get md(): (BooleanInput | NumberInput) { - return this._md; - } - private _md: (BooleanInput | NumberInput) = false; + readonly md = input(false, { transform: this.coerceInput }); /** * The number of columns/offset/order on large devices (<1200px). - * @type { 'auto' | number | boolean } + * @return { 'auto' | number | boolean } */ - @Input() - set lg(value) { - this._lg = this.coerceInput(value); - } - get lg(): (BooleanInput | NumberInput) { - return this._lg; - } - private _lg: (BooleanInput | NumberInput) = false; + readonly lg = input(false, { transform: this.coerceInput }); /** * The number of columns/offset/order on X-Large devices (<1400px). - * @type { 'auto' | number | boolean } + * @return { 'auto' | number | boolean } */ - @Input() - set xl(value) { - this._xl = this.coerceInput(value); - } - get xl(): (BooleanInput | NumberInput) { - return this._xl; - } - private _xl: (BooleanInput | NumberInput) = false; + readonly xl = input(false, { transform: this.coerceInput }); /** * The number of columns/offset/order on XX-Large devices (≥1400px). - * @type { 'auto' | number | boolean } + * @return { 'auto' | number | boolean } */ - @Input() - set xxl(value) { - this._xxl = this.coerceInput(value); - } - get xxl(): (BooleanInput | NumberInput) { - return this._xxl; - } - private _xxl: (BooleanInput | NumberInput) = false; - - @Input() offset?: (number | { 'xs'?: number, sm?: number, md?: number, lg?: number, xl?: number, xxl?: number }); - @Input() order?: (ColOrder | { xs?: ColOrder, sm?: ColOrder, md?: ColOrder, lg?: ColOrder, xl?: ColOrder, xxl?: ColOrder }); - - @HostBinding('class') - get hostClasses(): any { - - const classes: any = { + readonly xxl = input(false, { transform: this.coerceInput }); + + readonly breakpoints = computed(() => { + return { + xs: this.xs() || this.cCol(), + sm: this.sm(), + md: this.md(), + lg: this.lg(), + xl: this.xl(), + xxl: this.xxl() + } as Record; + }); + + readonly offset = input(); + readonly order = input(); + + readonly hostClasses = computed(() => { + const classes: Record = { col: true }; + const breakpoints = this.breakpoints(); + const offsetInput = this.offset(); + const orderInput = this.order(); + Object.keys(BreakpointInfix).forEach((breakpoint) => { - // @ts-ignore - const value: number | string | boolean = this[breakpoint]; + const value = breakpoints[breakpoint]; const infix = breakpoint === 'xs' ? '' : `-${breakpoint}`; classes[`col${infix}`] = value === true; - classes[`col${infix}-${value}`] = (typeof value === 'number') || (typeof value === 'string'); + classes[`col${infix}-${value}`] = typeof value === 'number' || typeof value === 'string'; }); - if (typeof this.offset === 'object') { - const offset = { ...this.offset }; + if (typeof offsetInput === 'object') { + const offset = { ...offsetInput }; Object.entries(offset).forEach((entry) => { const [breakpoint, value] = [...entry]; const infix = breakpoint === 'xs' ? '' : `-${breakpoint}`; classes[`offset${infix}-${value}`] = value >= 0 && value <= 11; }); } else { - classes[`offset-${this.offset}`] = (typeof this.offset === 'number') && this.offset > 0 && this.offset <= 11; + const offset = numberAttribute(offsetInput); + classes[`offset-${offset}`] = typeof offset === 'number' && offset > 0 && offset <= 11; } - if (typeof this.order === 'object') { - const order = { ...this.order }; + if (typeof orderInput === 'object') { + const order = { ...orderInput }; Object.entries(order).forEach((entry) => { const [breakpoint, value] = [...entry]; const infix = breakpoint === 'xs' ? '' : `-${breakpoint}`; - classes[`order${infix}-${value}`] = value; + classes[`order${infix}-${value}`] = !!value; }); } else { - classes[`order-${this.order}`] = !!this.order; + const order = orderInput; + classes[`order-${order}`] = !!order; } // if there is no 'col' class, add one - classes.col = (!Object.entries(classes).filter(i => i[0].startsWith('col-') && i[1]).length) || this.xs === true; - return classes; - } + classes['col'] = + !Object.entries(classes).filter((i) => i[0].startsWith('col-') && i[1]).length || breakpoints['xs'] === true; + return classes as Record; + }); - coerceInput(value: (BooleanInput | NumberInput)) { + coerceInput(value: BooleanInput | NumberInput) { if (value === 'auto') { return value; } if (value === '' || value === undefined || value === null) { - return coerceBooleanProperty(value); + return booleanAttribute(value); } if (typeof value === 'boolean') { return value; } - return coerceNumberProperty(value); + return numberAttribute(value); } } diff --git a/projects/coreui-angular/src/lib/grid/container.component.spec.ts b/projects/coreui-angular/src/lib/grid/container.component.spec.ts index 7ccc361a..8650c2b9 100644 --- a/projects/coreui-angular/src/lib/grid/container.component.spec.ts +++ b/projects/coreui-angular/src/lib/grid/container.component.spec.ts @@ -1,25 +1,37 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ContainerComponent } from './container.component'; +import { ComponentRef } from '@angular/core'; describe('ContainerComponent', () => { let component: ContainerComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ContainerComponent ] - }) - .compileComponents(); + imports: [ContainerComponent] + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(ContainerComponent); component = fixture.componentInstance; + componentRef = fixture.componentRef; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('container'); + expect(fixture.nativeElement).not.toHaveClass('container-fluid'); + expect(fixture.nativeElement).not.toHaveClass('container-xl'); + componentRef.setInput('fluid', true); + componentRef.setInput('breakpoint', 'xl'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('container-xl'); + }); }); diff --git a/projects/coreui-angular/src/lib/grid/container.component.ts b/projects/coreui-angular/src/lib/grid/container.component.ts index 12053ed7..8ae9c202 100644 --- a/projects/coreui-angular/src/lib/grid/container.component.ts +++ b/projects/coreui-angular/src/lib/grid/container.component.ts @@ -1,40 +1,31 @@ -import { Component, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; - -import { IContainer } from './container.type'; +import { booleanAttribute, Component, computed, input } from '@angular/core'; import { Breakpoints } from '../coreui.types'; @Component({ selector: 'c-container, [cContainer]', - template: '', + template: '', styleUrls: ['./container.component.scss'], + host: { '[class]': 'hostClasses()' } }) -export class ContainerComponent implements IContainer{ - - static ngAcceptInputType_fluid: BooleanInput; - +export class ContainerComponent { /** * Set container 100% wide until a breakpoint. */ - @Input() breakpoint: Exclude = ''; + readonly breakpoint = input>(''); + /** * Set container 100% wide, spanning the entire width of the viewport. + * @return boolean */ - @Input() - set fluid(value: boolean) { - this._fluid = coerceBooleanProperty(value); - }; - get fluid(): boolean { - return this._fluid; - } - private _fluid = false; + readonly fluid = input(false, { transform: booleanAttribute }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const breakpoint = this.breakpoint(); + const fluid = this.fluid(); return { - container: !this.fluid && !this.breakpoint, - 'container-fluid': this.fluid, - [`container-${this.breakpoint}`]: !!this.breakpoint, - }; - } + container: !fluid && !breakpoint, + 'container-fluid': !!fluid, + [`container-${breakpoint}`]: !!breakpoint + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/grid/container.type.ts b/projects/coreui-angular/src/lib/grid/container.type.ts index 1f26159e..6529a39a 100644 --- a/projects/coreui-angular/src/lib/grid/container.type.ts +++ b/projects/coreui-angular/src/lib/grid/container.type.ts @@ -1,6 +1,7 @@ import { Breakpoints } from '../coreui.types'; +import { InputSignal, InputSignalWithTransform } from '@angular/core'; export interface IContainer { - fluid?: boolean; - breakpoint?: Exclude; + fluid?: string | boolean | InputSignalWithTransform; + breakpoint?: Exclude | InputSignal>; } diff --git a/projects/coreui-angular/src/lib/grid/grid.module.ts b/projects/coreui-angular/src/lib/grid/grid.module.ts index 7a361910..8caf95f8 100644 --- a/projects/coreui-angular/src/lib/grid/grid.module.ts +++ b/projects/coreui-angular/src/lib/grid/grid.module.ts @@ -1,4 +1,3 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { ContainerComponent } from './container.component'; @@ -9,23 +8,21 @@ import { ColDirective } from './col.directive'; import { GutterDirective } from './gutter.directive'; @NgModule({ - imports: [CommonModule], - exports: [ - ContainerComponent, - RowComponent, + imports: [ ColComponent, - GutterDirective, - RowDirective, ColDirective, - ], - declarations: [ ContainerComponent, + GutterDirective, RowComponent, + RowDirective + ], + exports: [ ColComponent, - RowDirective, ColDirective, + ContainerComponent, GutterDirective, - ], - providers: [], + RowComponent, + RowDirective + ] }) export class GridModule {} diff --git a/projects/coreui-angular/src/lib/grid/gutter.directive.spec.ts b/projects/coreui-angular/src/lib/grid/gutter.directive.spec.ts index 8e8dabea..144458fe 100644 --- a/projects/coreui-angular/src/lib/grid/gutter.directive.spec.ts +++ b/projects/coreui-angular/src/lib/grid/gutter.directive.spec.ts @@ -1,8 +1,45 @@ +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; import { GutterDirective } from './gutter.directive'; +import { GutterBreakpoints, Gutters, IGutterObject } from './gutter.type'; + +@Component({ + imports: [GutterDirective], + template: '
' +}) +export class TestComponent { + gutter: IGutterObject | GutterBreakpoints | Gutters = 5; +} describe('GutterDirective', () => { + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }); + fixture = TestBed.createComponent(TestComponent); + debugElement = fixture.debugElement.query(By.directive(GutterDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new GutterDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new GutterDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css class', () => { + expect(debugElement.nativeElement).toHaveClass('g-5'); + fixture.componentInstance.gutter = { gx: 2, gy: 1 }; + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('gx-2'); + expect(debugElement.nativeElement).toHaveClass('gy-1'); + fixture.componentInstance.gutter = { md: { g: 3 } }; + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('g-md-3'); }); }); diff --git a/projects/coreui-angular/src/lib/grid/gutter.directive.ts b/projects/coreui-angular/src/lib/grid/gutter.directive.ts index ec596a7a..6a4a69be 100644 --- a/projects/coreui-angular/src/lib/grid/gutter.directive.ts +++ b/projects/coreui-angular/src/lib/grid/gutter.directive.ts @@ -1,46 +1,46 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; import { BreakpointInfix } from '../coreui.types'; import { GutterBreakpoints, Gutters, IGutter, IGutterObject } from './gutter.type'; @Directive({ // eslint-disable-next-line @angular-eslint/directive-selector - selector: '[gutter]' + selector: '[gutter]', + exportAs: 'gutter', + host: { + '[class]': 'hostClasses()' + } }) export class GutterDirective implements IGutter { /** * Define padding between columns to space and align content responsively in the Bootstrap grid system. */ - @Input() gutter: (IGutterObject | GutterBreakpoints | Gutters) = {}; - - constructor() { } - - @HostBinding('class') - get hostClasses(): any { + readonly gutter = input({}); - let gutterClass: any; + readonly hostClasses = computed(() => { + let gutterClass: Record; + const gutterInput = this.gutter(); - if (typeof this.gutter === 'number') { - gutterClass = GutterDirective.getGutterClasses({ g: this.gutter }); + if (typeof gutterInput === 'number') { + gutterClass = GutterDirective.getGutterClasses({ g: gutterInput }); return gutterClass; } { - // @ts-ignore - const { g, gx, gy } = { ...this.gutter }; + const { g, gx, gy } = { ...(gutterInput as IGutterObject) }; gutterClass = GutterDirective.getGutterClasses({ g, gx, gy }); } - Object.keys(BreakpointInfix).forEach(key => { + Object.keys(BreakpointInfix).forEach((key) => { // @ts-ignore - const gutter = this.gutter[key] ? { ...this.gutter[key] } : undefined; + const gutter: IGutterObject = gutterInput[key] ? { ...gutterInput[key] } : undefined; if (gutter) { const classes = GutterDirective.getGutterClasses(gutter, key); gutterClass = { ...gutterClass, ...classes }; } }); return gutterClass; - } + }); private static getGutterClasses(gutter: IGutterObject, breakpoint?: string): any { const { g, gx, gy } = { ...gutter }; diff --git a/projects/coreui-angular/src/lib/grid/gutter.type.ts b/projects/coreui-angular/src/lib/grid/gutter.type.ts index f8cf41d0..05864874 100644 --- a/projects/coreui-angular/src/lib/grid/gutter.type.ts +++ b/projects/coreui-angular/src/lib/grid/gutter.type.ts @@ -1,7 +1,8 @@ +import { type InputSignal } from '@angular/core'; import { BreakpointInfix } from '../coreui.types'; export interface IGutter { - gutter?: (IGutterObject | GutterBreakpoints | Gutters); + gutter?: InputSignal; } export type Gutters = 0 | 1 | 2 | 3 | 4 | 5 | number; diff --git a/projects/coreui-angular/src/lib/grid/row.component.scss b/projects/coreui-angular/src/lib/grid/row.component.scss deleted file mode 100644 index 8b137891..00000000 --- a/projects/coreui-angular/src/lib/grid/row.component.scss +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/grid/row.component.spec.ts b/projects/coreui-angular/src/lib/grid/row.component.spec.ts index 13e81fb1..93e7cce8 100644 --- a/projects/coreui-angular/src/lib/grid/row.component.spec.ts +++ b/projects/coreui-angular/src/lib/grid/row.component.spec.ts @@ -8,9 +8,9 @@ describe('RowComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ RowComponent ] + imports: [RowComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('RowComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('row'); + }); }); diff --git a/projects/coreui-angular/src/lib/grid/row.component.ts b/projects/coreui-angular/src/lib/grid/row.component.ts index 3dd989d7..4b1f1dda 100644 --- a/projects/coreui-angular/src/lib/grid/row.component.ts +++ b/projects/coreui-angular/src/lib/grid/row.component.ts @@ -4,7 +4,6 @@ import { RowDirective } from './row.directive'; @Component({ selector: 'c-row', - template: '', - styleUrls: ['./row.component.scss'], + template: '' }) export class RowComponent extends RowDirective {} diff --git a/projects/coreui-angular/src/lib/grid/row.directive.spec.ts b/projects/coreui-angular/src/lib/grid/row.directive.spec.ts index 65e2b2bc..52b62e41 100644 --- a/projects/coreui-angular/src/lib/grid/row.directive.spec.ts +++ b/projects/coreui-angular/src/lib/grid/row.directive.spec.ts @@ -1,8 +1,37 @@ +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RowDirective } from './row.directive'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [RowDirective], + template: `
` +}) +export class TestComponent {} describe('RowDirective', () => { + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }); + fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new RowDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new RowDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css class', () => { + debugElement = fixture.debugElement.query(By.css('#row0')); + expect(debugElement.nativeElement).toHaveClass('row'); + expect(debugElement.nativeElement).toHaveClass('row-cols-auto'); + expect(debugElement.nativeElement).toHaveClass('row-cols-md-7'); }); }); diff --git a/projects/coreui-angular/src/lib/grid/row.directive.ts b/projects/coreui-angular/src/lib/grid/row.directive.ts index 2e7dda96..a15098e5 100644 --- a/projects/coreui-angular/src/lib/grid/row.directive.ts +++ b/projects/coreui-angular/src/lib/grid/row.directive.ts @@ -1,62 +1,69 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; import { BreakpointInfix } from '../coreui.types'; -import { IRow, NumberOfColumns } from './row.type'; +import { NumberOfColumns } from './row.type'; @Directive({ - selector: '[cRow]' + selector: '[cRow]', + host: { + class: 'row', + '[class]': 'hostClasses()' + } }) -export class RowDirective implements IRow { +export class RowDirective { /** * The number of columns/offset/order on extra small devices (<576px). - * @type {{ cols: 'auto' | number } + * @return { cols: 'auto' | number } */ - @Input() xs?: NumberOfColumns; + readonly xs = input(); + /** * The number of columns/offset/order on small devices (<768px). - * @type {{ cols: 'auto' | number } + * @return { cols: 'auto' | number } */ - @Input() sm?: NumberOfColumns; + readonly sm = input(); + /** * The number of columns/offset/order on medium devices (<992px). - * @type {{ cols: 'auto' | number } + * @return { cols: 'auto' | number } */ - @Input() md?: NumberOfColumns; + readonly md = input(); + /** * The number of columns/offset/order on large devices (<1200px). - * @type {{ cols: 'auto' | number } + * @return { cols: 'auto' | number } */ - @Input() lg?: NumberOfColumns; + readonly lg = input(); + /** * The number of columns/offset/order on X-Large devices (<1400px). - * @type {{ cols: 'auto' | number } + * @return { cols: 'auto' | number } */ - @Input() xl?: NumberOfColumns; + readonly xl = input(); + /** * The number of columns/offset/order on XX-Large devices (≥1400px). - * @type {{ cols: 'auto' | number } + * @return { cols: 'auto' | number } */ - @Input() xxl?: NumberOfColumns; + readonly xxl = input(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const cols = this.xs(); - const cols = this.xs; - - const classes: any = { + const classes: Record = { row: true, - [`row-cols-${cols}`]: !!cols, + [`row-cols-${cols}`]: !!cols }; - Object.keys(BreakpointInfix).forEach(breakpoint => { + Object.keys(BreakpointInfix).forEach((breakpoint) => { // @ts-ignore - const value: any = this[breakpoint]; - if ((typeof value === 'number') || (typeof value === 'string')) { - const infix: string = breakpoint === 'xs' ? '' : breakpoint; - classes[`row-cols-${infix}-${value}`] = !!value; + const value: any = this[breakpoint](); + if (typeof value === 'number' || typeof value === 'string') { + const infix: string = breakpoint === 'xs' ? '' : `-${breakpoint}`; + classes[`row-cols${infix}-${value}`] = !!value; } }); return classes; - } + }); } diff --git a/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.spec.ts b/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.spec.ts index a4bb9929..1bf139af 100644 --- a/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.spec.ts +++ b/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.spec.ts @@ -1,25 +1,19 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Router } from '@angular/router'; import { HeaderBrandComponent } from './header-brand.component'; describe('HeaderBrandComponent', () => { let component: HeaderBrandComponent; let fixture: ComponentFixture; - let router: Router; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ RouterTestingModule.withRoutes([]) ], - declarations: [ HeaderBrandComponent ] - }) - .compileComponents(); + imports: [HeaderBrandComponent] + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(HeaderBrandComponent); - router = TestBed.inject(Router); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -27,4 +21,12 @@ describe('HeaderBrandComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('header-brand'); + }); + + it('should have role', () => { + expect(fixture.nativeElement.getAttribute('role')).toBe('button'); + }); }); diff --git a/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts b/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts index 2b8f3222..56face65 100644 --- a/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts +++ b/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts @@ -1,17 +1,19 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, input } from '@angular/core'; @Component({ selector: 'c-header-brand', - template: `` + template: '', + exportAs: 'cHeaderBrand', + host: { + '[attr.role]': 'role()', + class: 'header-brand' + } }) export class HeaderBrandComponent { /** * Default role for header-brand. [docs] - * @type string + * @return string * @default 'button' */ - @HostBinding('attr.role') - @Input() role = 'button'; - - @HostBinding('class.header-brand') headerBrandClass = true; + readonly role = input('button'); } diff --git a/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.spec.ts b/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.spec.ts index ef735cb3..cbf3019e 100644 --- a/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.spec.ts +++ b/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.spec.ts @@ -8,9 +8,9 @@ describe('HeaderDividerComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ HeaderDividerComponent ] + imports: [HeaderDividerComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('HeaderDividerComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('header-divider'); + }); }); diff --git a/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.ts b/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.ts index b754095e..6bf57be0 100644 --- a/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.ts +++ b/projects/coreui-angular/src/lib/header/header-divider/header-divider.component.ts @@ -1,11 +1,10 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-header-divider, [cHeaderDivider]', - template: `` + template: ``, + host: { + class: 'header-divider' + } }) -export class HeaderDividerComponent { - - @HostBinding('class.header-divider') headerDividerClass = true; - -} +export class HeaderDividerComponent {} diff --git a/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.spec.ts b/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.spec.ts index f2c62e63..aa593494 100644 --- a/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.spec.ts +++ b/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.spec.ts @@ -8,9 +8,8 @@ describe('HeaderNavComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ HeaderNavComponent ] - }) - .compileComponents(); + imports: [HeaderNavComponent] + }).compileComponents(); }); beforeEach(() => { @@ -22,4 +21,12 @@ describe('HeaderNavComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('header-nav'); + }); + + it('should have role', () => { + expect(fixture.nativeElement.getAttribute('role')).toBe('navigation'); + }); }); diff --git a/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts b/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts index e5e2c76b..6ea49036 100644 --- a/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts +++ b/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts @@ -1,18 +1,20 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, input } from '@angular/core'; @Component({ selector: 'c-header-nav', - template: ``, - styleUrls: ['./header-nav.component.scss'] + template: '', + styleUrls: ['./header-nav.component.scss'], + exportAs: 'cHeaderNav', + host: { + '[attr.role]': 'role()', + class: 'header-nav' + } }) export class HeaderNavComponent { /** * Default role for header-nav. [docs] - * @type string + * @return string * @default 'navigation' */ - @HostBinding('attr.role') - @Input() role = 'navigation'; - - @HostBinding('class.header-nav') headerNavClass = true; + readonly role = input('navigation'); } diff --git a/projects/coreui-angular/src/lib/header/header-text/header-text.component.spec.ts b/projects/coreui-angular/src/lib/header/header-text/header-text.component.spec.ts index 7bb1d55b..87fb1b8d 100644 --- a/projects/coreui-angular/src/lib/header/header-text/header-text.component.spec.ts +++ b/projects/coreui-angular/src/lib/header/header-text/header-text.component.spec.ts @@ -8,9 +8,9 @@ describe('HeaderTextComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ HeaderTextComponent ] + imports: [HeaderTextComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('HeaderTextComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('header-text'); + }); }); diff --git a/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts b/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts index 52aeeeaa..a777d57d 100644 --- a/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts +++ b/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts @@ -1,9 +1,10 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-header-text, [cHeaderText]', - template: ``, + template: '', + host: { + class: 'header-text' + } }) -export class HeaderTextComponent { - @HostBinding('class.header-text') headerTextClass = true; -} +export class HeaderTextComponent {} diff --git a/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.spec.ts b/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.spec.ts index 328f1445..9e9e6e2f 100644 --- a/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.spec.ts +++ b/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.spec.ts @@ -1,21 +1,46 @@ -import { TestBed } from '@angular/core/testing'; -import { ElementRef, Renderer2 } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; +import { By } from '@angular/platform-browser'; import { HeaderTogglerDirective } from './header-toggler.directive'; +@Component({ + imports: [HeaderTogglerDirective], + template: '
' +}) +export class TestComponent { + theme!: 'dark' | 'light' | undefined; +} + +class MockElementRef extends ElementRef {} + describe('HeaderTogglerDirective', () => { - let renderer: Renderer2; - let hostElement: ElementRef; + let fixture: ComponentFixture; + let debugElement: DebugElement; beforeEach(() => { TestBed.configureTestingModule({ - imports: [Renderer2], - providers: [Renderer2] + imports: [TestComponent], + providers: [Renderer2, { provide: ElementRef, useClass: MockElementRef }] }); + fixture = TestBed.createComponent(TestComponent); + debugElement = fixture.debugElement.query(By.directive(HeaderTogglerDirective)); + fixture.detectChanges(); }); it('should create an instance', () => { - const directive = new HeaderTogglerDirective(renderer, hostElement); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new HeaderTogglerDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css class', () => { + expect(debugElement.nativeElement).toHaveClass('header-toggler'); + }); + + it('should set attributes', () => { + expect(debugElement.nativeElement.getAttribute('type')).toBe('button'); + expect(debugElement.nativeElement.getAttribute('aria-label')).toBe('Toggle navigation'); }); }); diff --git a/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.ts b/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.ts index 4dcb065a..4d3df892 100644 --- a/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.ts +++ b/projects/coreui-angular/src/lib/header/header-toggler/header-toggler.directive.ts @@ -1,42 +1,41 @@ -import { AfterContentInit, Directive, ElementRef, HostBinding, Input, Renderer2 } from '@angular/core'; +import { AfterContentInit, Directive, ElementRef, inject, input, Renderer2 } from '@angular/core'; @Directive({ - selector: '[cHeaderToggler]' + selector: '[cHeaderToggler]', + exportAs: 'cHeaderToggler', + host: { + '[attr.type]': 'type()', + '[attr.aria-label]': 'ariaLabel()', + class: 'header-toggler' + } }) export class HeaderTogglerDirective implements AfterContentInit { + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); - @HostBinding('class.header-toggler') headerToggler = true; /** - * Default role for header-toggler. [docs] - * @type string + * Default type for header-toggler button. [docs] + * @return string * @default 'button' */ - @HostBinding('attr.type') - @Input() type = 'button'; + readonly type = input('button'); + /** * Default aria-label attr for header-toggler. [docs] * @type string * @default 'Toggle navigation' */ - @HostBinding('attr.aria-label') - @Input() ariaLabel = 'Toggle navigation'; - - private hasContent!: boolean; - - constructor( - private renderer: Renderer2, - private hostElement: ElementRef - ) { } + readonly ariaLabel = input('Toggle navigation'); addDefaultIcon(): void { - const span = this.renderer.createElement('span'); - this.renderer.addClass(span, 'header-toggler-icon'); - this.renderer.appendChild(this.hostElement.nativeElement, span); + const span = this.#renderer.createElement('span'); + this.#renderer.addClass(span, 'header-toggler-icon'); + this.#renderer.appendChild(this.#hostElement.nativeElement, span); } ngAfterContentInit(): void { - this.hasContent = this.hostElement.nativeElement.childNodes.length > 0; - if (!this.hasContent) { + const hasContent = this.#hostElement.nativeElement.childNodes.length > 0; + if (!hasContent) { this.addDefaultIcon(); } } diff --git a/projects/coreui-angular/src/lib/header/header.module.ts b/projects/coreui-angular/src/lib/header/header.module.ts index 008d30c7..840be290 100644 --- a/projects/coreui-angular/src/lib/header/header.module.ts +++ b/projects/coreui-angular/src/lib/header/header.module.ts @@ -1,5 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { HeaderComponent } from './header/header.component'; import { HeaderBrandComponent } from './header-brand/header-brand.component'; @@ -9,7 +8,7 @@ import { HeaderTextComponent } from './header-text/header-text.component'; import { HeaderTogglerDirective } from './header-toggler/header-toggler.directive'; @NgModule({ - declarations: [ + imports: [ HeaderComponent, HeaderBrandComponent, HeaderDividerComponent, @@ -17,9 +16,6 @@ import { HeaderTogglerDirective } from './header-toggler/header-toggler.directiv HeaderTextComponent, HeaderTogglerDirective ], - imports: [ - CommonModule - ], exports: [ HeaderComponent, HeaderBrandComponent, @@ -29,4 +25,4 @@ import { HeaderTogglerDirective } from './header-toggler/header-toggler.directiv HeaderTogglerDirective ] }) -export class HeaderModule { } +export class HeaderModule {} diff --git a/projects/coreui-angular/src/lib/header/header/header.component.html b/projects/coreui-angular/src/lib/header/header/header.component.html index 35158f2a..4d4c6216 100644 --- a/projects/coreui-angular/src/lib/header/header/header.component.html +++ b/projects/coreui-angular/src/lib/header/header/header.component.html @@ -1,8 +1,7 @@ -
- -
- - - - - +@if (!!container()) { +
+ +
+} @else { + +} diff --git a/projects/coreui-angular/src/lib/header/header/header.component.spec.ts b/projects/coreui-angular/src/lib/header/header/header.component.spec.ts index 88f979b2..b8713b3b 100644 --- a/projects/coreui-angular/src/lib/header/header/header.component.spec.ts +++ b/projects/coreui-angular/src/lib/header/header/header.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import {CommonModule} from '@angular/common'; import { RouterTestingModule } from '@angular/router/testing'; import { Router } from '@angular/router'; @@ -12,10 +11,11 @@ describe('HeaderComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ HeaderComponent ], - imports: [ CommonModule, RouterTestingModule.withRoutes([]) ], - }) - .compileComponents(); + imports: [ + RouterTestingModule.withRoutes([]), + HeaderComponent + ] + }).compileComponents(); })); beforeEach(() => { @@ -28,4 +28,8 @@ describe('HeaderComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('header'); + }); }); diff --git a/projects/coreui-angular/src/lib/header/header/header.component.ts b/projects/coreui-angular/src/lib/header/header/header.component.ts index 4b6f9932..097b56c0 100644 --- a/projects/coreui-angular/src/lib/header/header/header.component.ts +++ b/projects/coreui-angular/src/lib/header/header/header.component.ts @@ -1,45 +1,50 @@ -import {Component, Input, HostBinding} from '@angular/core'; +import { Component, computed, input, InputSignal } from '@angular/core'; +import { NgClass } from '@angular/common'; import { Positions } from '../../coreui.types'; + type Container = boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'fluid'; @Component({ selector: 'c-header, [c-header]', - templateUrl: './header.component.html' + templateUrl: './header.component.html', + imports: [NgClass], + exportAs: 'cHeader', + host: { '[attr.role]': 'role()', '[class]': 'hostClasses()' } }) export class HeaderComponent { /** * Defines optional container wrapping children elements. */ - @Input() container?: Container; + readonly container = input(); /** * Place header in non-static positions. */ - @Input() position?: Positions; + readonly position = input(); /** * Default role for header. [docs] * @type string - * @default 'header' + * @default 'banner' */ - @HostBinding('attr.role') - @Input() role = 'header'; + readonly role: InputSignal = input('banner'); - @HostBinding('class') - get getClasses(): any { - return !!this.container ? this.containerClasses : this.headerClasses; - } + readonly hostClasses = computed(() => { + return !!this.container() ? this.containerClasses() : this.headerClasses(); + }); - get headerClasses(): any { + readonly headerClasses = computed(() => { + const position = this.position(); return { header: true, - [`header-${this.position}`]: !!this.position, - }; - } + [`header-${position}`]: !!position + } as Record; + }); - get containerClasses(): any { + readonly containerClasses = computed(() => { + const container = this.container(); return { - container: this.container === true, - [`container-${this.container}`]: typeof this.container === 'string' - }; - } + container: container === true, + [`container-${container}`]: typeof container === 'string' + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/image/img.directive.spec.ts b/projects/coreui-angular/src/lib/image/img.directive.spec.ts index 3449eff7..73ff2214 100644 --- a/projects/coreui-angular/src/lib/image/img.directive.spec.ts +++ b/projects/coreui-angular/src/lib/image/img.directive.spec.ts @@ -1,8 +1,11 @@ +import { TestBed } from '@angular/core/testing'; import { ImgDirective } from './img.directive'; describe('ImgDirective', () => { it('should create an instance', () => { - const directive = new ImgDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ImgDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/image/img.directive.ts b/projects/coreui-angular/src/lib/image/img.directive.ts index 720f047d..13716cb5 100644 --- a/projects/coreui-angular/src/lib/image/img.directive.ts +++ b/projects/coreui-angular/src/lib/image/img.directive.ts @@ -1,81 +1,55 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, computed, Directive, input, InputSignal, InputSignalWithTransform } from '@angular/core'; @Directive({ - selector: '[cImg]' + selector: '[cImg]', + host: { + '[class]': 'hostClasses()', + '[style]': 'hostStyles()' + } }) export class ImgDirective { - static ngAcceptInputType_fluid: BooleanInput; - static ngAcceptInputType_rounded: BooleanInput; - static ngAcceptInputType_thumbnail: BooleanInput; - /** * Set the horizontal aligment. * @type {'' | 'start' | 'end' | 'center'} */ - @Input() align: '' | 'start' | 'end' | 'center' = ''; + readonly align: InputSignal<'' | 'start' | 'end' | 'center'> = input<'' | 'start' | 'end' | 'center'>(''); /** * Make image responsive. * @type boolean */ - @Input() - set fluid(value: boolean) { - this._fluid = coerceBooleanProperty(value); - }; - get fluid() { - return this._fluid; - } - private _fluid = false; + readonly fluid: InputSignalWithTransform = input(false, { transform: booleanAttribute }); /** * Make image rounded. * @type boolean */ - @Input() - set rounded(value: boolean){ - this._rounded = coerceBooleanProperty(value); - }; - get rounded() { - return this._rounded; - } - private _rounded = false; + readonly rounded: InputSignalWithTransform = input(false, { transform: booleanAttribute }); /** * Give an image a rounded 1px border appearance. * @type boolean */ - @Input() - set thumbnail(value: boolean) { - this._thumbnail = coerceBooleanProperty(value); - }; - get thumbnail() { - return this._thumbnail; - } - private _thumbnail = false; + readonly thumbnail: InputSignalWithTransform = input(false, { transform: booleanAttribute }); /** * Color for image placeholder. */ - @Input() placeholderColor = 'transparent'; + readonly placeholderColor = input('transparent'); - @HostBinding('style') - get getStyles(): any { - return {backgroundColor: this.placeholderColor}; - } + readonly hostStyles = computed(() => { + return { backgroundColor: this.placeholderColor() }; + }); - @HostBinding('class') - get hostClasses(): any { - const align = this.align; + readonly hostClasses = computed(() => { + const align = this.align(); return { [`float-${align}`]: align === 'start' || align === 'end', 'd-block': align === 'center', 'mx-auto': align === 'center', - 'img-fluid': this.fluid, - 'rounded': this.rounded, - 'img-thumbnail': this.thumbnail, - }; - } - - constructor() {} + 'img-fluid': this.fluid(), + rounded: this.rounded(), + 'img-thumbnail': this.thumbnail() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/image/img.module.ts b/projects/coreui-angular/src/lib/image/img.module.ts index 38105e4e..22d31542 100644 --- a/projects/coreui-angular/src/lib/image/img.module.ts +++ b/projects/coreui-angular/src/lib/image/img.module.ts @@ -1,16 +1,8 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { ImgDirective } from './img.directive'; @NgModule({ - imports: [ - CommonModule - ], - exports: [ - ImgDirective - ], - declarations: [ - ImgDirective - ], + imports: [ImgDirective], + exports: [ImgDirective] }) -export class ImgModule { } +export class ImgModule {} diff --git a/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts b/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts index 48b305c9..9ad3f3c0 100644 --- a/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts +++ b/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts @@ -1,35 +1,34 @@ -import { Component, DebugElement, ElementRef } from '@angular/core'; +import { Component, ElementRef } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ListGroupItemDirective } from './list-group-item.directive'; -import { By } from '@angular/platform-browser'; class MockElementRef extends ElementRef {} @Component({ - template: `
  • ` + template: '
  • ', + imports: [ListGroupItemDirective] }) -class TestComponent { } +class TestComponent {} describe('ListGroupItemDirective', () => { - let component: TestComponent; let fixture: ComponentFixture; - let liEl: DebugElement; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [ListGroupItemDirective, TestComponent], + imports: [ListGroupItemDirective, TestComponent], providers: [{ provide: ElementRef, useClass: MockElementRef }] - }) + }); fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; - liEl = fixture.debugElement.query(By.css('li')); fixture.detectChanges(); // initial binding - }) + }); it('should create an instance', () => { - const directive = new ListGroupItemDirective(liEl); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ListGroupItemDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/list-group/list-group-item.directive.ts b/projects/coreui-angular/src/lib/list-group/list-group-item.directive.ts index 54fc035a..3cdafc6e 100644 --- a/projects/coreui-angular/src/lib/list-group/list-group-item.directive.ts +++ b/projects/coreui-angular/src/lib/list-group/list-group-item.directive.ts @@ -1,72 +1,73 @@ -import { Directive, ElementRef, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + booleanAttribute, + computed, + Directive, + ElementRef, + inject, + input, + InputSignal, + InputSignalWithTransform +} from '@angular/core'; import { Colors } from '../coreui.types'; @Directive({ selector: '[cListGroupItem], c-list-group-item', - exportAs: 'cListGroupItem' + exportAs: 'cListGroupItem', + host: { + '[class]': 'hostClasses()', + '[attr.aria-disabled]': 'ariaDisabled()', + '[attr.aria-current]': 'ariaCurrent()', + '[attr.disabled]': 'attrDisabled()', + '[attr.tabindex]': 'tabIndex()' + } }) export class ListGroupItemDirective { - - static ngAcceptInputType_disabled: BooleanInput; + readonly hostElement = inject(ElementRef); /** * Toggle the active state for the component. - * @type boolean + * @type InputSignal */ - @Input() active?: boolean; + readonly active: InputSignal = input(); /** * Sets the color context of the component to one of CoreUI’s themed colors. - * @type Colors + * @type InputSignal */ - @Input() color?: Colors; + readonly color: InputSignal = input(); /** * Set disabled attr for the host element. [docs] * @type boolean */ - @Input() - get disabled(): boolean { - return this._disabled; - } - set disabled(value: boolean) { - this._disabled = coerceBooleanProperty(value); - } - private _disabled = false; + readonly disabled: InputSignalWithTransform = input(false, { transform: booleanAttribute }); - @HostBinding('attr.aria-disabled') - get isDisabled(): boolean | null { - return this.disabled || null; - } - - @HostBinding('attr.disabled') - get attrDisabled() { - return this.disabled ? '' : null; - }; - - @HostBinding('attr.tabindex') - get getTabindex(): string | null { - return this.disabled ? '-1' : null; - } - - @HostBinding('attr.aria-current') get ariaCurrent(): boolean { - return !!this.active; - } - - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { const host: HTMLElement = this.hostElement.nativeElement; return { 'list-group-item': true, 'list-group-item-action': host.nodeName === 'A' || host.nodeName === 'BUTTON', - active: !!this.active, - disabled: this.isDisabled, - [`list-group-item-${this.color}`]: !!this.color - }; - } + active: !!this.active(), + disabled: this._disabled(), + [`list-group-item-${this.color()}`]: !!this.color() + } as Record; + }); + + readonly _disabled = computed(() => this.disabled()); + + readonly ariaDisabled = computed(() => { + return this._disabled() ? true : null; + }); + + readonly attrDisabled = computed(() => { + return this._disabled() ? '' : null; + }); + + readonly tabIndex = computed(() => { + return this._disabled() ? '-1' : null; + }); - constructor( - private hostElement: ElementRef - ) { } + readonly ariaCurrent = computed(() => { + return this.active() || null; + }); } diff --git a/projects/coreui-angular/src/lib/list-group/list-group.directive.spec.ts b/projects/coreui-angular/src/lib/list-group/list-group.directive.spec.ts index 82663dca..f8e6246e 100644 --- a/projects/coreui-angular/src/lib/list-group/list-group.directive.spec.ts +++ b/projects/coreui-angular/src/lib/list-group/list-group.directive.spec.ts @@ -1,8 +1,11 @@ +import { TestBed } from '@angular/core/testing'; import { ListGroupDirective } from './list-group.directive'; describe('ListGroupDirective', () => { it('should create an instance', () => { - const directive = new ListGroupDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ListGroupDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/list-group/list-group.directive.ts b/projects/coreui-angular/src/lib/list-group/list-group.directive.ts index f98492b5..827f96d4 100644 --- a/projects/coreui-angular/src/lib/list-group/list-group.directive.ts +++ b/projects/coreui-angular/src/lib/list-group/list-group.directive.ts @@ -1,42 +1,32 @@ -import {Directive, HostBinding, Input} from '@angular/core'; +import { booleanAttribute, computed, Directive, input, InputSignalWithTransform } from '@angular/core'; import { Sizes } from '../coreui.types'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; @Directive({ - selector: '[cListGroup]' + selector: '[cListGroup]', + host: { + class: 'list-group', + '[class]': 'hostClasses()' + } }) export class ListGroupDirective { - static ngAcceptInputType_flush: BooleanInput; - /** * Remove some borders and rounded corners to render list group items edge-to-edge in a parent component (e.g., ``). * @type boolean */ - @Input() - set flush(value: boolean) { - this._flush = coerceBooleanProperty(value); - }; - get flush() { - return this._flush; - } - private _flush = false; + readonly flush: InputSignalWithTransform = input(false, { transform: booleanAttribute }); + /** * Specify horizontal layout type. */ - @Input() horizontal?: boolean | Sizes; + readonly horizontal = input(); - @HostBinding('class') - get hostClasses(): any { - const classes = { + readonly hostClasses = computed(() => { + const horizontal = this.horizontal(); + return { 'list-group': true, - 'list-group-horizontal': this.horizontal === true || this.horizontal === '', - [`list-group-horizontal-${this.horizontal}`]: !!this.horizontal && typeof this.horizontal !== 'boolean', - 'list-group-flush': this.flush, - }; - return classes; - } - - constructor( ) { } - + 'list-group-horizontal': horizontal === true || horizontal === '', + [`list-group-horizontal-${horizontal}`]: !!horizontal && typeof horizontal !== 'boolean', + 'list-group-flush': this.flush() + } as Record; + }); } - diff --git a/projects/coreui-angular/src/lib/list-group/list-group.module.ts b/projects/coreui-angular/src/lib/list-group/list-group.module.ts index 16ad9f17..169a5419 100644 --- a/projects/coreui-angular/src/lib/list-group/list-group.module.ts +++ b/projects/coreui-angular/src/lib/list-group/list-group.module.ts @@ -1,17 +1,10 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { ListGroupDirective } from './list-group.directive'; import { ListGroupItemDirective } from './list-group-item.directive'; @NgModule({ - declarations: [ListGroupDirective, ListGroupItemDirective], - exports: [ - ListGroupDirective, - ListGroupItemDirective - ], - imports: [ - CommonModule - ] + exports: [ListGroupDirective, ListGroupItemDirective], + imports: [ListGroupDirective, ListGroupItemDirective] }) -export class ListGroupModule { } +export class ListGroupModule {} diff --git a/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.spec.ts b/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.spec.ts index 9e1a6483..b52f4237 100644 --- a/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.spec.ts +++ b/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.spec.ts @@ -8,9 +8,9 @@ describe('ModalBodyComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ModalBodyComponent ] + imports: [ModalBodyComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ModalBodyComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('modal-body'); + }); }); diff --git a/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts b/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts index e699c0e9..6f343ec4 100644 --- a/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts @@ -1,16 +1,9 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-modal-body', - template: '', - styleUrls: ['./modal-body.component.scss'] + template: '', + styleUrls: ['./modal-body.component.scss'], + host: { class: 'modal-body' } }) -export class ModalBodyComponent { - - @HostBinding('class') - get hostClasses(): any { - return { - 'modal-body': true, - }; - } -} +export class ModalBodyComponent {} diff --git a/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.spec.ts b/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.spec.ts index 0f503f9d..ac6dad05 100644 --- a/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.spec.ts +++ b/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.spec.ts @@ -8,9 +8,9 @@ describe('ModalContentComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ModalContentComponent ] + imports: [ModalContentComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ModalContentComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('modal-content'); + }); }); diff --git a/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts b/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts index 6655e5ac..32296445 100644 --- a/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts @@ -1,17 +1,8 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-modal-content', - template: '' + template: '', + host: { class: 'modal-content' } }) -export class ModalContentComponent { - - constructor() { } - - @HostBinding('class') - get hostClasses(): any { - return { - 'modal-content': true - }; - } -} +export class ModalContentComponent {} diff --git a/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.spec.ts b/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.spec.ts index 1ba9ff23..dfbf52c6 100644 --- a/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.spec.ts +++ b/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.spec.ts @@ -1,25 +1,81 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentRef } from '@angular/core'; import { ModalDialogComponent } from './modal-dialog.component'; describe('ModalDialogComponent', () => { let component: ModalDialogComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ModalDialogComponent ] - }) - .compileComponents(); + imports: [ModalDialogComponent] + }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(ModalDialogComponent); component = fixture.componentInstance; + componentRef = fixture.componentRef; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('modal-dialog'); + }); + + it('should have css classes for alignment prop', () => { + componentRef.setInput('alignment', 'center'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('modal-dialog-centered'); + componentRef.setInput('alignment', 'top'); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('modal-dialog-centered'); + expect(fixture.nativeElement).toHaveClass('modal-dialog'); + }); + + it('should have css classes for fullscreen prop', () => { + componentRef.setInput('fullscreen', true); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('modal-fullscreen'); + for (const size of ['sm', 'md', 'lg', 'xl', 'xxl']) { + componentRef.setInput('fullscreen', size); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass(`modal-fullscreen-${size}-down`); + } + componentRef.setInput('fullscreen', false); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('modal-fullscreen'); + expect(fixture.nativeElement).toHaveClass('modal-dialog'); + }); + + it('should have css classes for scrollable prop', () => { + expect(fixture.nativeElement).not.toHaveClass('modal-dialog-scrollable'); + componentRef.setInput('scrollable', true); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('modal-dialog-scrollable'); + componentRef.setInput('scrollable', false); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('modal-dialog-scrollable'); + expect(fixture.nativeElement).toHaveClass('modal-dialog'); + }); + + it('should have css classes for size prop', () => { + for (const size of ['sm', 'lg', 'xl']) { + componentRef.setInput('size', size); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass(`modal-${size}`); + } + componentRef.setInput('size', undefined); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('modal-sm'); + expect(fixture.nativeElement).not.toHaveClass('modal-lg'); + expect(fixture.nativeElement).not.toHaveClass('modal-xl'); + expect(fixture.nativeElement).toHaveClass('modal-dialog'); + }); }); diff --git a/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts b/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts index efdc9904..878850d1 100644 --- a/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts @@ -1,40 +1,48 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { booleanAttribute, Component, computed, input } from '@angular/core'; @Component({ selector: 'c-modal-dialog', - template: '', + template: '', styleUrls: ['./modal-dialog.component.scss'], + host: { class: 'modal-dialog', '[class]': 'hostClasses()' } }) export class ModalDialogComponent { /** * Align the modal in the center or top of the screen. - * @type {'top' | 'center'} + * @default undefined */ - @Input() alignment?: 'top' | 'center'; + readonly alignment = input<'top' | 'center'>(); + /** * Set modal to covers the entire user viewport. - * @type {boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'} + * @return {boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'} */ - @Input() fullscreen?: boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'; + readonly fullscreen = input(); + /** * Does the modal dialog itself scroll, or does the whole dialog scroll within the window. - * @type boolean + * @default false + * @return {boolean} */ - @Input() scrollable?: boolean; + readonly scrollable = input(false, { transform: booleanAttribute }); + /** * Size the component small, large, or extra large. + * @default undefined + * @return {'sm' | 'lg' | 'xl'} */ - @Input() size?: 'sm' | 'lg' | 'xl'; + readonly size = input<'sm' | 'lg' | 'xl'>(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const fullscreen = this.fullscreen(); + const size = this.size(); return { 'modal-dialog': true, - 'modal-dialog-centered': this.alignment === 'center', - 'modal-fullscreen': this.fullscreen === true, - [`modal-fullscreen-${this.fullscreen}-down`]: this.fullscreen, - 'modal-dialog-scrollable': this.scrollable, - [`modal-${this.size}`]: this.size - }; - } + 'modal-dialog-centered': this.alignment() === 'center', + 'modal-fullscreen': fullscreen === true, + [`modal-fullscreen-${fullscreen}-down`]: typeof fullscreen === 'string', + 'modal-dialog-scrollable': this.scrollable(), + [`modal-${size}`]: !!size + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.spec.ts b/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.spec.ts index 315f6aee..2c309374 100644 --- a/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.spec.ts +++ b/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.spec.ts @@ -1,10 +1,44 @@ +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { Component, DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; import { ModalToggleDirective } from './modal-toggle.directive'; -import { ModalService } from '../modal.service'; + +@Component({ + template: '', + imports: [ModalToggleDirective] +}) +class TestComponent {} describe('ModalDismissDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(ModalToggleDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const modalService = new ModalService() - const directive = new ModalToggleDirective(modalService); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ModalToggleDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should handle click', fakeAsync(() => { + const directive = debugElement.injector.get(ModalToggleDirective); + const spy = spyOn(directive, 'dismiss'); + debugElement.nativeElement.dispatchEvent(new Event('click')); + directive.dismiss(new Event('click')); + tick(); + fixture.detectChanges(); + expect(spy).toHaveBeenCalledTimes(2); + })); }); diff --git a/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.ts b/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.ts index 7754dd04..308eb555 100644 --- a/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.ts +++ b/projects/coreui-angular/src/lib/modal/modal-dismiss/modal-toggle.directive.ts @@ -1,23 +1,24 @@ -import { Directive, HostListener, Input } from '@angular/core'; +import { Directive, inject, input } from '@angular/core'; import { ModalService } from '../modal.service'; @Directive({ - selector: '[cModalToggle]' + selector: '[cModalToggle]', + host: { + '(click)': 'dismiss($event)' + } }) export class ModalToggleDirective { + readonly #modalService = inject(ModalService); + /** * Html id attr of modal to dismiss. + * @default undefined */ - @Input('cModalToggle') id: string | undefined; - - constructor( - private modalService: ModalService - ) { } + readonly toggle = input(undefined, { alias: 'cModalToggle' }); - @HostListener('click', ['$event']) - dismiss($event: any): void { + dismiss($event: Event): void { $event.preventDefault(); - this.modalService.toggle({show: 'toggle', id: this.id}); + this.#modalService.toggle({ show: 'toggle', id: this.toggle() }); } } diff --git a/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.spec.ts b/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.spec.ts index 79bc2359..9c4d0279 100644 --- a/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.spec.ts +++ b/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.spec.ts @@ -8,9 +8,9 @@ describe('ModalFooterComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ModalFooterComponent ] + imports: [ModalFooterComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ModalFooterComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('modal-footer'); + }); }); diff --git a/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts b/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts index 24313030..f185d507 100644 --- a/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts @@ -1,16 +1,8 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-modal-footer', - template: '', + template: '', + host: { class: 'modal-footer' } }) -export class ModalFooterComponent { - - @HostBinding('class') - get hostClasses(): any { - return { - 'modal-footer': true, - }; - } - -} +export class ModalFooterComponent {} diff --git a/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.spec.ts b/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.spec.ts index 445e5b1e..4c259a4b 100644 --- a/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.spec.ts +++ b/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.spec.ts @@ -8,9 +8,9 @@ describe('ModalHeaderComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ModalHeaderComponent ] + imports: [ModalHeaderComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ModalHeaderComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('modal-header'); + }); }); diff --git a/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts b/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts index 668b9551..57dfe32d 100644 --- a/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts @@ -1,17 +1,8 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-modal-header', - template: ` - `, + template: '', + host: { class: 'modal-header' } }) -export class ModalHeaderComponent { - - @HostBinding('class') - get hostClasses(): any { - return { - 'modal-header': true - }; - } - -} +export class ModalHeaderComponent {} diff --git a/projects/coreui-angular/src/lib/modal/modal-title/modal-title.directive.ts b/projects/coreui-angular/src/lib/modal/modal-title/modal-title.directive.ts index 7d903ba4..f9f923a6 100644 --- a/projects/coreui-angular/src/lib/modal/modal-title/modal-title.directive.ts +++ b/projects/coreui-angular/src/lib/modal/modal-title/modal-title.directive.ts @@ -1,15 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cModalTitle]' + selector: '[cModalTitle]', + host: { class: 'modal-title' } }) -export class ModalTitleDirective { - - @HostBinding('class') - get hostClasses(): any { - return { - 'modal-title': true, - }; - } - -} +export class ModalTitleDirective {} diff --git a/projects/coreui-angular/src/lib/modal/modal.module.ts b/projects/coreui-angular/src/lib/modal/modal.module.ts index bf81c447..34b93216 100644 --- a/projects/coreui-angular/src/lib/modal/modal.module.ts +++ b/projects/coreui-angular/src/lib/modal/modal.module.ts @@ -1,6 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { A11yModule } from '@angular/cdk/a11y'; import { ModalBodyComponent } from './modal-body/modal-body.component'; import { ModalContentComponent } from './modal-content/modal-content.component'; @@ -13,32 +11,26 @@ import { ModalComponent } from './modal/modal.component'; import { ModalService } from './modal.service'; @NgModule({ - declarations: [ + exports: [ ModalBodyComponent, + ModalComponent, ModalContentComponent, ModalDialogComponent, - ModalToggleDirective, ModalFooterComponent, ModalHeaderComponent, ModalTitleDirective, - ModalComponent, + ModalToggleDirective ], - exports: [ + imports: [ ModalBodyComponent, + ModalComponent, ModalContentComponent, ModalDialogComponent, - ModalToggleDirective, ModalFooterComponent, ModalHeaderComponent, ModalTitleDirective, - ModalComponent, - ], - imports: [ - CommonModule, - A11yModule + ModalToggleDirective ], - providers: [ - ModalService - ] + providers: [ModalService] }) -export class ModalModule { } +export class ModalModule {} diff --git a/projects/coreui-angular/src/lib/modal/modal.service.ts b/projects/coreui-angular/src/lib/modal/modal.service.ts index 7ac60196..12ced01e 100644 --- a/projects/coreui-angular/src/lib/modal/modal.service.ts +++ b/projects/coreui-angular/src/lib/modal/modal.service.ts @@ -12,13 +12,10 @@ export interface IModalAction { providedIn: 'root' }) export class ModalService { - - private modalState = new Subject(); - modalState$ = this.modalState.asObservable(); - - constructor() {} + readonly #modalState = new Subject(); + readonly modalState$ = this.#modalState.asObservable(); toggle(action: IModalAction): void { - this.modalState.next(action); + this.#modalState.next(action); } } diff --git a/projects/coreui-angular/src/lib/modal/modal/modal.component.html b/projects/coreui-angular/src/lib/modal/modal/modal.component.html index 5de848d2..c060ce9e 100644 --- a/projects/coreui-angular/src/lib/modal/modal/modal.component.html +++ b/projects/coreui-angular/src/lib/modal/modal/modal.component.html @@ -1,11 +1,11 @@ + [alignment]="alignment()" + [fullscreen]="fullscreen()" + [scrollable]="scrollable()" + [size]="size()"> -
    - +
    +
    diff --git a/projects/coreui-angular/src/lib/modal/modal/modal.component.scss b/projects/coreui-angular/src/lib/modal/modal/modal.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/modal/modal/modal.component.spec.ts b/projects/coreui-angular/src/lib/modal/modal/modal.component.spec.ts index 58092e14..b49afc6e 100644 --- a/projects/coreui-angular/src/lib/modal/modal/modal.component.spec.ts +++ b/projects/coreui-angular/src/lib/modal/modal/modal.component.spec.ts @@ -2,7 +2,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ModalComponent } from './modal.component'; -import { ModalModule } from '../modal.module'; describe('ModalComponent', () => { let component: ModalComponent; @@ -10,10 +9,8 @@ describe('ModalComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ NoopAnimationsModule, ModalModule ], - declarations: [ ModalComponent ], - }) - .compileComponents(); + imports: [NoopAnimationsModule, ModalComponent] + }).compileComponents(); }); beforeEach(() => { @@ -25,4 +22,19 @@ describe('ModalComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('modal'); + expect(fixture.nativeElement).toHaveClass('fade'); + }); + + // it('should be visible', fakeAsync(() => { + // fixture.componentRef.setInput('visible', true); + // fixture.detectChanges(); + // expect(fixture.nativeElement).toHaveClass('show'); + // })); + + // it('should call event handling functions', fakeAsync(() => { + // + // })); }); diff --git a/projects/coreui-angular/src/lib/modal/modal/modal.component.ts b/projects/coreui-angular/src/lib/modal/modal/modal.component.ts index 48f1de66..6a6811eb 100644 --- a/projects/coreui-angular/src/lib/modal/modal/modal.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal/modal.component.ts @@ -1,25 +1,31 @@ +import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; +import { DOCUMENT } from '@angular/common'; import { + AfterViewInit, + booleanAttribute, Component, + computed, + DestroyRef, + effect, ElementRef, - EventEmitter, - HostBinding, - HostListener, - Inject, - Input, + inject, + input, OnDestroy, OnInit, - Output, + output, Renderer2, - ViewChild + signal, + untracked, + viewChild, + WritableSignal } from '@angular/core'; -import { DOCUMENT } from '@angular/common'; -import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; -import { Subscription } from 'rxjs'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { A11yModule, FocusMonitor } from '@angular/cdk/a11y'; import { ModalService } from '../modal.service'; import { BackdropService } from '../../backdrop/backdrop.service'; import { ModalContentComponent } from '../modal-content/modal-content.component'; +import { ModalDialogComponent } from '../modal-dialog/modal-dialog.component'; @Component({ selector: 'c-modal', @@ -37,221 +43,259 @@ import { ModalContentComponent } from '../modal-content/modal-content.component' // display: 'none' }) ), - transition('visible <=> *', [animate('300ms')]) + transition('visible <=> *', [animate('150ms')]) ]) ], templateUrl: './modal.component.html', - styleUrls: ['./modal.component.scss'], - exportAs: 'cModal' + exportAs: 'cModal', + imports: [ModalDialogComponent, ModalContentComponent, A11yModule], + host: { + class: 'modal', + '[class]': 'hostClasses()', + '[attr.role]': 'role()', + '[attr.inert]': 'ariaHidden', + '[attr.id]': 'id', + '[attr.aria-modal]': 'ariaModal()', + '[attr.tabindex]': '-1', + '[@showHide]': 'animateTrigger()', + '(@showHide.start)': 'animateStart($event)', + '(@showHide.done)': 'animateDone($event)', + '(mousedown)': 'onMouseDownHandler($event)', + '(click)': 'onClickHandler($event)', + '(document:keyup)': 'onKeyUpHandler($event)' + } }) -export class ModalComponent implements OnInit, OnDestroy { - - static ngAcceptInputType_scrollable: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; +export class ModalComponent implements OnInit, OnDestroy, AfterViewInit { + readonly #document = inject(DOCUMENT); + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + readonly #modalService = inject(ModalService); + readonly #backdropService = inject(BackdropService); - constructor( - @Inject(DOCUMENT) private document: Document, - private renderer: Renderer2, - private hostElement: ElementRef, - private modalService: ModalService, - private backdropService: BackdropService - ) { } + readonly #destroyRef = inject(DestroyRef); + readonly #focusMonitor = inject(FocusMonitor); /** * Align the modal in the center or top of the screen. - * @type {'top' | 'center'} + * @return {'top' | 'center'} * @default 'top' */ - @Input() alignment?: 'top' | 'center' = 'top'; + readonly alignment = input<'top' | 'center'>('top'); + /** * Apply a backdrop on body while modal is open. - * @type boolean | 'static' + * @return boolean | 'static' * @default true */ - @Input() backdrop: boolean | 'static' = true; + readonly backdrop = input(true); + /** * Set modal to cover the entire user viewport. - * @type {boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'} + * @return {boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'} * @default undefined */ - @Input() fullscreen?: boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'; + readonly fullscreen = input(); + /** * Closes the modal when escape key is pressed. - * @type boolean + * @return boolean * @default true */ - @Input() keyboard = true; - @Input() id?: string; + readonly keyboard = input(true, { transform: booleanAttribute }); + + readonly attrId = input(undefined, { alias: 'id' }); + + get id() { + return this.attrId(); + } + /** * Size the component small, large, or extra large. + * @return {'sm' | 'lg' | 'xl'} + * @default undefined */ - @Input() size?: 'sm' | 'lg' | 'xl'; + readonly size = input<'sm' | 'lg' | 'xl'>(); + /** * Remove animation to create modal that simply appear rather than fade in to view. */ - @Input() transition = true; + readonly transition = input(true, { transform: booleanAttribute }); + /** - * Default role for modal. [docs] - * @type string + * Default role for modal + * @return string * @default 'dialog' */ - @Input() @HostBinding('attr.role') role = 'dialog'; + readonly role = input('dialog'); + /** - * Set aria-modal html attr for modal. [docs] + * Set aria-modal html attr for modal * @type boolean - * @default true + * @default null */ - @Input() @HostBinding('attr.aria-modal') ariaModal = true; + readonly ariaModalInput = input(false, { transform: booleanAttribute, alias: 'ariaModal' }); + + readonly ariaModal = computed(() => { + return this.visible || this.ariaModalInput() ? true : null; + }); /** * Create a scrollable modal that allows scrolling the modal body. - * @type boolean + * @return boolean + * @default false */ - @Input() - set scrollable(value: boolean) { - this._scrollable = coerceBooleanProperty(value); - } - - get scrollable(): boolean { - return this._scrollable; - } - - private _scrollable = false; + readonly scrollable = input(false, { transform: booleanAttribute }); /** * Toggle the visibility of modal component. - * @type boolean + * @return boolean + * @default false */ - @Input() + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); + + readonly #visibleInputEffect = effect(() => { + const visible = this.visibleInput(); + untracked(() => { + this.visible = visible; + }); + }); + set visible(value: boolean) { - const newValue = coerceBooleanProperty(value); - if (this._visible !== newValue) { - this._visible = newValue; - this.setBackdrop(this.backdrop !== false && newValue); - this.setBodyStyles(newValue); - this.visibleChange.emit(newValue); + if (this.#visible() !== value) { + this.#visible.set(value); + this.setBodyStyles(value); + this.setBackdrop(this.backdrop() !== false && value); + this.visibleChange.emit(value); } } get visible(): boolean { - return this._visible; + return this.#visible(); } - private _visible!: boolean; + readonly #visible: WritableSignal = signal(false); + + readonly #activeElement = signal(null); + + readonly #visibleEffect = effect(() => { + const visible = this.#visible(); + const afterViewInit = this.#afterViewInit(); + untracked(() => { + if (visible && afterViewInit) { + this.#activeElement.set(this.#document.activeElement as HTMLElement); + // this.#activeElement()?.blur(); + setTimeout(() => { + const focusable = this.modalContentRef()?.nativeElement.querySelectorAll( + '[tabindex]:not([tabindex="-1"]), button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled])' + ); + if (focusable?.length) { + this.#focusMonitor.focusVia(focusable[0], 'keyboard'); + } + }); + } else { + const activeElement = this.#activeElement(); + if (activeElement && this.#document.contains(activeElement)) { + this.#focusMonitor.focusVia(activeElement, 'keyboard'); + setTimeout(() => { + // this.#activeElement()?.focus(); + this.#activeElement.set(null); + }); + } + } + }); + }); /** * Event triggered on modal dismiss. + * @return boolean */ - @Output() visibleChange = new EventEmitter(); + readonly visibleChange = output(); - @ViewChild(ModalContentComponent, { read: ElementRef }) modalContent!: ElementRef; - private activeBackdrop!: any; - private stateToggleSubscription!: Subscription; + // @ViewChild(ModalContentComponent, { read: ElementRef }) modalContent!: ElementRef; + // @ViewChild('modalContentRef', { read: ElementRef }) modalContentRef!: ElementRef; + // readonly modalContentRef = viewChild(ModalContentComponent, { read: ElementRef }); + readonly modalContentRef = viewChild('modalContentRef', { read: ElementRef }); + + #activeBackdrop!: any; // private inBoundingClientRect!: boolean; - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { modal: true, - fade: this.transition, + fade: this.transition(), show: this.show - }; - } + } as Record; + }); - @HostBinding('attr.aria-hidden') get ariaHidden(): boolean | null { return this.visible ? null : true; - }; - - @HostBinding('attr.tabindex') - get tabIndex(): string | null { - return '-1'; } - @HostBinding('@showHide') - get animateTrigger(): string { + readonly animateTrigger = computed(() => { return this.visible ? 'visible' : 'hidden'; - } + }); get show(): boolean { - return this.visible && this._show; + return this.visible && this.#show(); } set show(value: boolean) { - this._show = value; + this.#show.set(value); } - private _show = true; + readonly #show = signal(true); - private get scrollbarWidth() { - // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes - const documentWidth = this.document.documentElement.clientWidth; - const scrollbarWidth = Math.abs((window?.innerWidth ?? documentWidth) - documentWidth); - return `${scrollbarWidth}px`; - } - - @HostListener('@showHide.start', ['$event']) animateStart(event: AnimationEvent) { - const scrollbarWidth = this.scrollbarWidth; if (event.toState === 'visible') { - this.renderer.setStyle(this.document.body, 'overflow', 'hidden'); - this.renderer.setStyle(this.document.body, 'padding-right', scrollbarWidth); - this.renderer.setStyle(this.hostElement.nativeElement, 'display', 'block'); + this.#backdropService.hideScrollbar(); + this.#renderer.setStyle(this.#hostElement.nativeElement, 'display', 'block'); } else { - if (!this.transition) { - this.renderer.setStyle(this.hostElement.nativeElement, 'display', 'none'); + if (!this.transition()) { + this.#renderer.setStyle(this.#hostElement.nativeElement, 'display', 'none'); } } } - @HostListener('@showHide.done', ['$event']) animateDone(event: AnimationEvent) { setTimeout(() => { if (event.toState === 'hidden') { - this.renderer.setStyle(this.hostElement.nativeElement, 'display', 'none'); - this.renderer.removeStyle(this.document.body, 'overflow'); - this.renderer.removeStyle(this.document.body, 'padding-right'); + this.#renderer.setStyle(this.#hostElement.nativeElement, 'display', 'none'); } }); this.show = this.visible; } - @HostListener('document:keyup', ['$event']) - onKeyDownHandler(event: KeyboardEvent): void { - if (event.key === 'Escape' && this.keyboard && this.visible) { - if (this.backdrop === 'static') { + onKeyUpHandler(event: KeyboardEvent): void { + if (event.key === 'Escape' && this.keyboard() && this.visible) { + if (this.backdrop() === 'static') { this.setStaticBackdrop(); } else { - this.modalService.toggle({ show: false, modal: this }); + this.#modalService.toggle({ show: false, modal: this }); } } } private mouseDownTarget: EventTarget | null = null; - @HostListener('mousedown', ['$event']) public onMouseDownHandler($event: MouseEvent): void { this.mouseDownTarget = $event.target; } - @HostListener('click', ['$event']) public onClickHandler($event: MouseEvent): void { - if (this.mouseDownTarget !== $event.target) { this.mouseDownTarget = null; return; } const targetElement = $event.target; - if (targetElement === this.hostElement.nativeElement) { - - if (this.backdrop === 'static') { + if (targetElement === this.#hostElement.nativeElement) { + if (this.backdrop() === 'static') { this.setStaticBackdrop(); return; } - this.modalService.toggle({ show: false, modal: this }); + this.#modalService.toggle({ show: false, modal: this }); } } @@ -259,56 +303,54 @@ export class ModalComponent implements OnInit, OnDestroy { this.stateToggleSubscribe(); } + readonly #afterViewInit = signal(false); + + ngAfterViewInit(): void { + this.#afterViewInit.set(true); + } + ngOnDestroy(): void { - this.modalService.toggle({ show: false, modal: this }); - this.stateToggleSubscribe(false); + this.#modalService.toggle({ show: false, modal: this }); + this.#afterViewInit.set(false); } - private stateToggleSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.stateToggleSubscription = this.modalService.modalState$.subscribe( - (action) => { - if (this === action.modal || this.id === action.id) { - if ('show' in action) { - this.visible = action?.show === 'toggle' ? !this.visible : action.show; - } - } else { - if (this.visible) { - this.visible = false; - } - } + private stateToggleSubscribe(): void { + this.#modalService.modalState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((action) => { + if (this === action.modal || this.id === action.id) { + if ('show' in action) { + this.visible = action?.show === 'toggle' ? !this.visible : action.show; } - ); - } else { - this.stateToggleSubscription.unsubscribe(); - } + } else { + if (this.visible) { + this.visible = false; + } + } + }); } private setBackdrop(setBackdrop: boolean): void { - if (setBackdrop) { - this.activeBackdrop = this.backdropService.setBackdrop('modal'); - } else { - this.activeBackdrop = this.backdropService.clearBackdrop(this.activeBackdrop); - } + this.#activeBackdrop = setBackdrop + ? this.#backdropService.setBackdrop('modal') + : this.#backdropService.clearBackdrop(this.#activeBackdrop); } private setBodyStyles(open: boolean): void { if (open) { - if (this.backdrop === true) { - this.renderer.addClass(this.document.body, 'modal-open'); + if (this.backdrop() === true) { + this.#renderer.addClass(this.#document.body, 'modal-open'); } } else { - this.renderer.removeClass(this.document.body, 'modal-open'); + this.#renderer.removeClass(this.#document.body, 'modal-open'); } } private setStaticBackdrop(): void { - if (this.transition) { - this.renderer.addClass(this.hostElement.nativeElement, 'modal-static'); - this.renderer.setStyle(this.hostElement.nativeElement, 'overflow-y', 'hidden'); + if (this.transition()) { + this.#renderer.addClass(this.#hostElement.nativeElement, 'modal-static'); + this.#renderer.setStyle(this.#hostElement.nativeElement, 'overflow-y', 'hidden'); setTimeout(() => { - this.renderer.removeClass(this.hostElement.nativeElement, 'modal-static'); - this.renderer.removeStyle(this.hostElement.nativeElement, 'overflow-y'); + this.#renderer.removeClass(this.#hostElement.nativeElement, 'modal-static'); + this.#renderer.removeStyle(this.#hostElement.nativeElement, 'overflow-y'); }, 300); } } diff --git a/projects/coreui-angular/src/lib/nav/nav-item.component.html b/projects/coreui-angular/src/lib/nav/nav-item.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/nav/nav-item.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/nav/nav-item.component.spec.ts b/projects/coreui-angular/src/lib/nav/nav-item.component.spec.ts index 8dc2e012..47d74216 100644 --- a/projects/coreui-angular/src/lib/nav/nav-item.component.spec.ts +++ b/projects/coreui-angular/src/lib/nav/nav-item.component.spec.ts @@ -8,9 +8,9 @@ describe('NavItemComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ NavItemComponent ] + imports: [NavItemComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('NavItemComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('nav-item'); + }); }); diff --git a/projects/coreui-angular/src/lib/nav/nav-item.component.ts b/projects/coreui-angular/src/lib/nav/nav-item.component.ts index 2ae549b4..937ea2d7 100644 --- a/projects/coreui-angular/src/lib/nav/nav-item.component.ts +++ b/projects/coreui-angular/src/lib/nav/nav-item.component.ts @@ -1,16 +1,9 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-nav-item', - templateUrl: './nav-item.component.html', - styleUrls: ['./nav-item.component.scss'] + template: '', + styleUrls: ['./nav-item.component.scss'], + host: { class: 'nav-item' } }) -export class NavItemComponent { - - @HostBinding('class') - get hostClasses(): any { - return { - 'nav-item': true - }; - } -} +export class NavItemComponent {} diff --git a/projects/coreui-angular/src/lib/nav/nav-link.directive.spec.ts b/projects/coreui-angular/src/lib/nav/nav-link.directive.spec.ts index 656438ff..1d130b31 100644 --- a/projects/coreui-angular/src/lib/nav/nav-link.directive.spec.ts +++ b/projects/coreui-angular/src/lib/nav/nav-link.directive.spec.ts @@ -1,8 +1,85 @@ import { NavLinkDirective } from './nav-link.directive'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, ComponentRef, DebugElement, input } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +@Component({ + template: 'test', + imports: [NavLinkDirective] +}) +class TestComponent { + readonly active = input(false); + readonly disabled = input(false); +} describe('NavLinkDirective', () => { + let fixture: ComponentFixture; + let component: TestComponent; + let componentRef: ComponentRef; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + debugElement = fixture.debugElement.query(By.directive(NavLinkDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new NavLinkDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new NavLinkDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('nav-link'); + }); + + it('should have css classes for active', () => { + expect(debugElement.nativeElement).not.toHaveClass('active'); + componentRef.setInput('active', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('active'); + componentRef.setInput('active', false); + fixture.detectChanges(); + expect(debugElement.nativeElement).not.toHaveClass('active'); + }); + + it('should have css classes for disabled', () => { + expect(debugElement.nativeElement).not.toHaveClass('disabled'); + componentRef.setInput('disabled', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('disabled'); + componentRef.setInput('disabled', false); + fixture.detectChanges(); + expect(debugElement.nativeElement).not.toHaveClass('disabled'); + }); + + it('should have aria-* attr for active', () => { + expect(debugElement.nativeElement.getAttribute('aria-current')).not.toBe('page'); + componentRef.setInput('active', true); + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('aria-current')).toBe('page'); + }); + + it('should have attributes for disabled', () => { + expect(debugElement.nativeElement.getAttribute('disabled')).toBeNull(); + expect(debugElement.nativeElement.getAttribute('aria-disabled')).not.toBeTruthy(); + expect(debugElement.nativeElement.getAttribute('tabindex')).not.toBe('-1'); + expect(debugElement.nativeElement.style.cursor).toBe('pointer'); + componentRef.setInput('disabled', true); + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('disabled')).not.toBeNull(); + expect(debugElement.nativeElement.getAttribute('aria-disabled')).toBeTruthy(); + expect(debugElement.nativeElement.getAttribute('tabindex')).toBe('-1'); + expect(debugElement.nativeElement.style.cursor).not.toBe('pointer'); + componentRef.setInput('disabled', false); + fixture.detectChanges(); }); }); diff --git a/projects/coreui-angular/src/lib/nav/nav-link.directive.ts b/projects/coreui-angular/src/lib/nav/nav-link.directive.ts index 9984f5b8..e32e7d00 100644 --- a/projects/coreui-angular/src/lib/nav/nav-link.directive.ts +++ b/projects/coreui-angular/src/lib/nav/nav-link.directive.ts @@ -1,77 +1,57 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, computed, Directive, effect, input } from '@angular/core'; @Directive({ - selector: '[cNavLink]' + selector: '[cNavLink]', + host: { + '[class]': 'hostClasses()', + '[attr.aria-current]': 'ariaCurrent()', + '[attr.aria-disabled]': 'ariaDisabled', + '[attr.disabled]': 'attrDisabled', + '[attr.tabindex]': 'attrTabindex', + '[style.cursor]': 'styleCursor' + } }) export class NavLinkDirective { - - static ngAcceptInputType_cNavLink: BooleanInput; - static ngAcceptInputType_disabled: BooleanInput; - /** * Sets .nav-link class to the host. [docs] - * @type boolean * @default true */ - @Input() - set cNavLink(value: boolean) { - this._cNavLink = coerceBooleanProperty(value); - }; - get cNavLink() { - return this._cNavLink; - } - private _cNavLink = true + readonly cNavLink = input(true, { transform: booleanAttribute }); /** * Toggle the active state for the component. [docs] - * @type boolean + * @default undefined */ - @Input() active?: boolean; + readonly active = input(); + /** * Set disabled attr for the host element. [docs] - * @type boolean + * @default false */ - @Input() - get disabled(): boolean { - return this._disabled; - } - set disabled(value: boolean) { - this._disabled = coerceBooleanProperty(value); - } - private _disabled = false; - - @HostBinding('attr.aria-current') - get ariaCurrent(): string | null { - return this.active ? 'page' : null; - } - - @HostBinding('attr.aria-disabled') - get isDisabled(): boolean | null { - return this.disabled || null; - } - - @HostBinding('attr.disabled') - get attrDisabled () { - return this.disabled ? '' : null; - }; - - @HostBinding('attr.tabindex') - get getTabindex(): string | null { - return this.disabled ? '-1' : null; - } - - @HostBinding('style.cursor') - get getCursorStyle(): string | null { - return this.disabled ? null : 'pointer'; - } - - @HostBinding('class') - get hostClasses(): any { + readonly disabled = input(false, { transform: booleanAttribute }); + + readonly ariaCurrent = computed(() => { + return this.active() ? 'page' : null; + }); + + ariaDisabled: boolean | null = null; + attrDisabled: boolean | string | null = null; + attrTabindex: '-1' | null = null; + styleCursor: 'pointer' | null = null; + + readonly #disabledEffect = effect(() => { + const disabled = this.disabled(); + this.ariaDisabled = disabled || null; + this.attrDisabled = disabled ? '' : null; + this.attrTabindex = disabled ? '-1' : null; + this.styleCursor = disabled ? null : 'pointer'; + }); + + readonly hostClasses = computed(() => { return { - 'nav-link': this.cNavLink, - disabled: this.disabled, - active: this.active - }; - } + 'nav-link': this.cNavLink(), + disabled: this.disabled(), + active: this.active() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/nav/nav.component.scss b/projects/coreui-angular/src/lib/nav/nav.component.scss index 47e7d7d1..4961e30a 100644 --- a/projects/coreui-angular/src/lib/nav/nav.component.scss +++ b/projects/coreui-angular/src/lib/nav/nav.component.scss @@ -1,3 +1,10 @@ :host .nav-link:focus { outline: 0; } + +// todo: temp fix for nav-underline-border +:host.nav-underline-border { + column-gap: 0; +} + + diff --git a/projects/coreui-angular/src/lib/nav/nav.component.spec.ts b/projects/coreui-angular/src/lib/nav/nav.component.spec.ts index f2be3f09..5d400f13 100644 --- a/projects/coreui-angular/src/lib/nav/nav.component.spec.ts +++ b/projects/coreui-angular/src/lib/nav/nav.component.spec.ts @@ -1,25 +1,87 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NavComponent } from './nav.component'; +import { ComponentRef } from '@angular/core'; describe('NavComponent', () => { let component: NavComponent; let fixture: ComponentFixture; + let componentRef: ComponentRef; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ NavComponent ] - }) - .compileComponents(); + imports: [NavComponent] + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(NavComponent); component = fixture.componentInstance; + componentRef = fixture.componentRef; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('nav'); + }); + + it('should have css classes for layout', () => { + componentRef.setInput('layout', 'fill'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('nav-fill'); + componentRef.setInput('layout', 'justified'); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('nav-fill'); + expect(fixture.nativeElement).toHaveClass('nav-justified'); + componentRef.setInput('layout', undefined); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('nav-fill'); + expect(fixture.nativeElement).not.toHaveClass('nav-justified'); + }); + + it('should have css classes for variant', () => { + expect(fixture.nativeElement).not.toHaveClass('nav-tabs'); + expect(fixture.nativeElement).not.toHaveClass('nav-pills'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline-border'); + + componentRef.setInput('variant', 'tabs'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveClass('nav-tabs'); + expect(fixture.nativeElement).not.toHaveClass('nav-pills'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline-border'); + + componentRef.setInput('variant', 'pills'); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('nav-tabs'); + expect(fixture.nativeElement).toHaveClass('nav-pills'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline-border'); + + componentRef.setInput('variant', 'underline'); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('nav-tabs'); + expect(fixture.nativeElement).not.toHaveClass('nav-pills'); + expect(fixture.nativeElement).toHaveClass('nav-underline'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline-border'); + + componentRef.setInput('variant', 'underline-border'); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('nav-tabs'); + expect(fixture.nativeElement).not.toHaveClass('nav-pills'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline'); + expect(fixture.nativeElement).toHaveClass('nav-underline-border'); + + componentRef.setInput('variant', undefined); + fixture.detectChanges(); + expect(fixture.nativeElement).not.toHaveClass('nav-tabs'); + expect(fixture.nativeElement).not.toHaveClass('nav-pills'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline'); + expect(fixture.nativeElement).not.toHaveClass('nav-underline-border'); + }); }); diff --git a/projects/coreui-angular/src/lib/nav/nav.component.ts b/projects/coreui-angular/src/lib/nav/nav.component.ts index b48003dc..5cfcece9 100644 --- a/projects/coreui-angular/src/lib/nav/nav.component.ts +++ b/projects/coreui-angular/src/lib/nav/nav.component.ts @@ -1,29 +1,31 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, computed, input } from '@angular/core'; @Component({ selector: 'c-nav', - template: ` - `, - styleUrls: ['./nav.component.scss'] + template: '', + styleUrls: ['./nav.component.scss'], + host: { class: 'nav', '[class]': 'hostClasses()' } }) export class NavComponent { /** * Specify a layout type for component. - * @type {'fill' | 'justified'} + * @default undefined */ - @Input() layout?: 'fill' | 'justified'; + readonly layout = input<'fill' | 'justified'>(); + /** * Set the nav variant to tabs or pills. - * @type {'tabs' | 'pills' | 'underline'} + * @default undefined */ - @Input() variant?: '' | 'tabs' | 'pills' ; + readonly variant = input<'tabs' | 'pills' | 'underline' | 'underline-border' | ''>(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const layout = this.layout(); + const variant = this.variant(); return { nav: true, - [`nav-${this.layout}`]: !!this.layout, - [`nav-${this.variant}`]: !!this.variant - }; - } + [`nav-${layout}`]: !!layout, + [`nav-${variant}`]: !!variant + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/nav/nav.module.ts b/projects/coreui-angular/src/lib/nav/nav.module.ts index 152608cb..70c75f6c 100644 --- a/projects/coreui-angular/src/lib/nav/nav.module.ts +++ b/projects/coreui-angular/src/lib/nav/nav.module.ts @@ -1,14 +1,18 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { NavComponent } from './nav.component'; import { NavItemComponent } from './nav-item.component'; import { NavLinkDirective } from './nav-link.directive'; @NgModule({ - declarations: [NavComponent, NavItemComponent, NavLinkDirective], imports: [ - CommonModule + NavComponent, + NavItemComponent, + NavLinkDirective ], - exports: [NavComponent, NavItemComponent, NavLinkDirective] + exports: [ + NavComponent, + NavItemComponent, + NavLinkDirective + ] }) -export class NavModule { } +export class NavModule {} diff --git a/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.spec.ts b/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.spec.ts index c75fcf02..91b3141d 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.spec.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.spec.ts @@ -1,8 +1,11 @@ import { NavbarBrandDirective } from './navbar-brand.directive'; +import { TestBed } from '@angular/core/testing'; describe('NavbarBrandDirective', () => { it('should create an instance', () => { - const directive = new NavbarBrandDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new NavbarBrandDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.ts b/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.ts index b91d089e..a8a2a83b 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-brand/navbar-brand.directive.ts @@ -1,11 +1,9 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive, input } from '@angular/core'; @Directive({ - selector: '[cNavbarBrand]' + selector: '[cNavbarBrand]', + host: { class: 'navbar-brand', '[attr.role]': 'role()' } }) export class NavbarBrandDirective { - - @HostBinding('class.navbar-brand') navbarBrand = true; - @HostBinding('attr.role') role = 'button'; - + readonly role = input('button'); } diff --git a/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.spec.ts b/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.spec.ts index 5adc7827..e0f104b8 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.spec.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.spec.ts @@ -8,9 +8,9 @@ describe('NavbarNavComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ NavbarNavComponent ] + imports: [NavbarNavComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('NavbarNavComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('navbar-nav'); + }); }); diff --git a/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts b/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts index 5a067908..36e68d2d 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts @@ -1,33 +1,21 @@ -import { Component, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Component, computed, input } from '@angular/core'; @Component({ selector: 'c-navbar-nav', - template: '', + template: '', + host: { '[class]': 'hostClasses()' } }) export class NavbarNavComponent { - - static ngAcceptInputType_scroll: BooleanInput; - /** * Enable vertical scrolling of a collapsed navbar toggleable contents. * @type boolean */ - @Input() - set scroll(value: boolean) { - this._scroll = coerceBooleanProperty(value); - }; - get scroll() { - return this._scroll; - } - private _scroll = false; + readonly scroll = input(false, { transform: booleanAttribute }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { 'navbar-nav': true, - 'navbar-nav-scroll': this.scroll - }; - } - + 'navbar-nav-scroll': this.scroll() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.html b/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.spec.ts b/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.spec.ts index bc06684b..97577f18 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.spec.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.spec.ts @@ -8,9 +8,9 @@ describe('NavbarTextComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ NavbarTextComponent ] + imports: [NavbarTextComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('NavbarTextComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('navbar-text'); + }); }); diff --git a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts b/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts index abfc13ec..33180716 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts @@ -1,11 +1,8 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-navbar-text', - template: '', + template: '', + host: { class: 'navbar-text' } }) -export class NavbarTextComponent { - - @HostBinding('class.navbar-text') navbarTextClass = true; - -} +export class NavbarTextComponent {} diff --git a/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.spec.ts b/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.spec.ts index 4a820bfa..55899436 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.spec.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.spec.ts @@ -1,12 +1,75 @@ +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; import { NavbarTogglerDirective } from './navbar-toggler.directive'; -import { ElementRef, Renderer2 } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { provideAnimationsAsync } from '@angular/platform-browser/animations/async'; +import { CollapseDirective } from '../../collapse'; + +class MockElementRef extends ElementRef {} + +@Component({ + imports: [NavbarTogglerDirective, CollapseDirective], + template: ` + +
    + ` +}) +class TestComponent {} describe('NavbarTogglerDirective', () => { - let renderer: Renderer2; - let hostElement: ElementRef; + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + let debugElementCollapse: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [Renderer2, { provide: ElementRef, useValue: MockElementRef }, provideAnimationsAsync()] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(NavbarTogglerDirective)); + debugElementCollapse = fixture.debugElement.query(By.directive(CollapseDirective)); + fixture.detectChanges(); + }); it('should create an instance', () => { - const directive = new NavbarTogglerDirective(renderer, hostElement); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new NavbarTogglerDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('navbar-toggler'); + }); + + it('should have default aria-label', () => { + expect(debugElement.nativeElement.getAttribute('aria-label')).toBe('Toggle navigation'); + }); + + it('should have default type', () => { + expect(debugElement.nativeElement.getAttribute('type')).toBe('button'); + }); + + it('should toggle collapse on click', fakeAsync(() => { + const collapseRef = debugElementCollapse.injector.get(CollapseDirective); + expect(collapseRef.visible()).toBeFalse(); + fixture.autoDetectChanges(); + debugElement.nativeElement.dispatchEvent(new Event('click')); + expect(collapseRef.visible()).toBeTrue(); + debugElement.nativeElement.dispatchEvent(new Event('click')); + expect(collapseRef.visible()).toBeFalse(); + })); + + it('should add default icon', () => { + const directive = debugElement.injector.get(NavbarTogglerDirective); + directive.addDefaultIcon(); + const renderer = debugElement.injector.get(Renderer2); + const span = debugElement.nativeElement.querySelector('span'); + expect(span).toBeTruthy(); + expect(span.classList.contains('navbar-toggler-icon')).toBeTrue(); }); }); diff --git a/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.ts b/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.ts index 6799ac5f..c159b6f7 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-toggler/navbar-toggler.directive.ts @@ -1,54 +1,59 @@ -import { AfterContentInit, Directive, ElementRef, HostBinding, HostListener, Input, Renderer2 } from '@angular/core'; +import { afterNextRender, Directive, ElementRef, inject, input, Renderer2 } from '@angular/core'; import { CollapseDirective } from '../../collapse'; @Directive({ - selector: '[cNavbarToggler]' + selector: '[cNavbarToggler]', + host: { + '[attr.aria-label]': 'ariaLabel()', + '[attr.type]': 'type()', + class: 'navbar-toggler', + '(click)': 'handleClick($event)' + } }) -export class NavbarTogglerDirective implements AfterContentInit { +export class NavbarTogglerDirective { + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + + constructor() { + afterNextRender({ + read: () => { + const hasContent = this.#hostElement.nativeElement.childNodes.length as boolean; + if (!hasContent) { + this.addDefaultIcon(); + } + } + }); + } + /** * Reference to navbar collapse element (via # template variable) . [docs] * @type string * @default 'button' */ - @Input('cNavbarToggler') collapseRef?: CollapseDirective; - @HostBinding('class.navbar-toggler') navbarToggler = true; + readonly collapseRef = input(undefined, { alias: 'cNavbarToggler' }); + /** * Default type for navbar-toggler. [docs] * @type string * @default 'button' */ - @HostBinding('attr.type') - @Input() type = 'button'; + readonly type = input('button'); + /** * Default aria-label attr for navbar-toggler. [docs] * @type string * @default 'Toggle navigation' */ - @HostBinding('attr.aria-label') - @Input() ariaLabel = 'Toggle navigation'; - - private hasContent!: boolean; - - constructor( - private renderer: Renderer2, - private hostElement: ElementRef - ) { } + readonly ariaLabel = input('Toggle navigation'); - @HostListener('click', ['$event']) - handleClick() { - this.collapseRef?.toggle(!this.collapseRef?.visible); + handleClick($event: MouseEvent): void { + const collapseRef = this.collapseRef(); + collapseRef?.toggle(!collapseRef?.visible()); } addDefaultIcon(): void { - const span = this.renderer.createElement('span'); - this.renderer.addClass(span, 'navbar-toggler-icon'); - this.renderer.appendChild(this.hostElement.nativeElement, span); - } - - ngAfterContentInit(): void { - this.hasContent = this.hostElement.nativeElement.childNodes.length as boolean; - if (!this.hasContent) { - this.addDefaultIcon(); - } + const span = this.#renderer.createElement('span'); + this.#renderer.addClass(span, 'navbar-toggler-icon'); + this.#renderer.appendChild(this.#hostElement.nativeElement, span); } } diff --git a/projects/coreui-angular/src/lib/navbar/navbar.component.html b/projects/coreui-angular/src/lib/navbar/navbar.component.html index 66e9e109..86c946dd 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar.component.html +++ b/projects/coreui-angular/src/lib/navbar/navbar.component.html @@ -1,11 +1,11 @@ - + -
    - +
    +
    - + diff --git a/projects/coreui-angular/src/lib/navbar/navbar.component.scss b/projects/coreui-angular/src/lib/navbar/navbar.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/navbar/navbar.component.spec.ts b/projects/coreui-angular/src/lib/navbar/navbar.component.spec.ts index cb0cff46..fbf41b8f 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar.component.spec.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar.component.spec.ts @@ -8,9 +8,8 @@ describe('NavbarComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ NavbarComponent ] - }) - .compileComponents(); + imports: [NavbarComponent] + }).compileComponents(); })); beforeEach(() => { @@ -22,4 +21,16 @@ describe('NavbarComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('navbar'); + }); + + it('should have container class', () => { + fixture.componentRef.setInput('expand', 'xl'); + fixture.componentRef.setInput('container', 'sm'); + fixture.detectChanges(); + expect(fixture.componentInstance.containerClass()).toBe('container-sm'); + expect(fixture.componentInstance.breakpoint()).toBe(''); + }); }); diff --git a/projects/coreui-angular/src/lib/navbar/navbar.component.ts b/projects/coreui-angular/src/lib/navbar/navbar.component.ts index 080be553..11c037e8 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar.component.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar.component.ts @@ -1,91 +1,131 @@ -import { AfterContentInit, Component, ContentChild, ElementRef, HostBinding, Input } from '@angular/core'; - +import { + AfterContentInit, + afterRender, + Component, + computed, + contentChild, + ElementRef, + inject, + input, + OnDestroy, + signal +} from '@angular/core'; +import { DOCUMENT, NgClass, NgTemplateOutlet } from '@angular/common'; import { BreakpointObserver } from '@angular/cdk/layout'; import { CollapseDirective } from '../collapse'; import { Colors } from '../coreui.types'; +import { ThemeDirective } from '../shared'; +import { Subscription } from 'rxjs'; // todo: fix container prop issue not rendering children -// todo: workaroud - use component directly in template +// todo: workaround - use component directly in template @Component({ - selector: 'c-navbar', - templateUrl: './navbar.component.html', - styleUrls: ['./navbar.component.scss'] + selector: 'c-navbar', + templateUrl: './navbar.component.html', + imports: [NgClass, NgTemplateOutlet], + hostDirectives: [{ directive: ThemeDirective, inputs: ['colorScheme'] }], + host: { '[class]': 'hostClasses()', '[attr.role]': 'role()' } }) -export class NavbarComponent implements AfterContentInit { +export class NavbarComponent implements AfterContentInit, OnDestroy { + readonly #breakpointObserver = inject(BreakpointObserver); + readonly #document = inject(DOCUMENT); + readonly #hostElement = inject(ElementRef); + /** * Sets the color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() color?: Colors; - /** - * Sets if the color of text should be colored for a light or dark dark background. - */ - @Input() colorScheme?: 'dark' | 'light' = 'light'; + readonly color = input(); + /** * Defines optional container wrapping children elements. */ - @Input() container?: boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'fluid'; + readonly container = input(); + /** * Defines the responsive breakpoint to determine when content collapses. */ - @Input() expand?: boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'; + readonly expand = input(); + /** * Place component in non-static positions. */ - @Input() placement?: 'fixed-top' | 'fixed-bottom' | 'sticky-top'; + readonly placement = input<'fixed-top' | 'fixed-bottom' | 'sticky-top'>(); - @ContentChild(CollapseDirective) collapse!: CollapseDirective; + readonly role = input('navigation'); - @HostBinding('attr.role') - @Input() role = 'navigation'; + readonly collapse = contentChild(CollapseDirective); - constructor( - private hostElement: ElementRef, - private breakpointObserver: BreakpointObserver - ) {} - - @HostBinding('class') - get hostClasses(): any { - const expandClassSuffix: string = this.expand === true ? '' : `-${this.expand}`; + readonly hostClasses = computed(() => { + const color = this.color(); + const expand = this.expand(); + const expandClassSuffix: string = expand === true ? '' : `-${expand}`; + const placement = this.placement(); return { navbar: true, - 'navbar-light': this.colorScheme === 'light', - 'navbar-dark': this.colorScheme === 'dark', - [`navbar-expand${expandClassSuffix}`]: !!this.expand, - [`bg-${this.color}`]: !!this.color, - [`${this.placement}`]: !!this.placement - }; - } + [`navbar-expand${expandClassSuffix}`]: !!expand, + [`bg-${color}`]: !!color, + [`${placement}`]: !!placement + } as Record; + }); - get containerClass(): string { - return `container${this.container !== true ? '-' + this.container : ''}`; - } + readonly containerClass = computed(() => { + const container = this.container(); + return `container${container !== true ? '-' + container : ''}`; + }); + + readonly computedStyle = signal(''); + + readonly afterNextRenderFn = afterRender({ + read: () => { + const expand = this.expand(); + if (typeof expand === 'string') { + const computedStyle = + this.#document.defaultView + ?.getComputedStyle(this.#hostElement.nativeElement) + ?.getPropertyValue(`--cui-breakpoint-${expand}`) ?? false; + computedStyle && this.computedStyle.set(computedStyle); + } + } + }); - get breakpoint(): string | boolean { - if (typeof this.expand === 'string') { - return getComputedStyle(this.hostElement.nativeElement).getPropertyValue(`--cui-breakpoint-${this.expand}`); + readonly breakpoint = computed(() => { + const expand = this.expand(); + if (typeof expand === 'string') { + return this.computedStyle(); } return false; - } + }); + + #observer!: Subscription; ngAfterContentInit(): void { - if (this.breakpoint) { - const onBreakpoint = `(min-width: ${this.breakpoint})`; - this.breakpointObserver.observe([onBreakpoint]).subscribe(result => { - if (this.collapse) { - const animate = this.collapse.animate; - this.collapse.toggle(false); - this.collapse.animate = false; - setTimeout(() => { - this.collapse.toggle(result.matches); + const breakpoint = this.breakpoint(); + if (breakpoint) { + const onBreakpoint = `(min-width: ${breakpoint})`; + this.#observer = this.#breakpointObserver + .observe([onBreakpoint]) + .pipe() + .subscribe((result) => { + const collapse = this.collapse(); + if (collapse) { + const animate = collapse.animate(); + collapse.animate.set(false); + collapse.toggle(false); setTimeout(() => { - this.collapse.animate = animate; + collapse.toggle(result.matches); + setTimeout(() => { + collapse.animate.set(animate); + }); }); - }); - } - }); + } + }); } } + + ngOnDestroy(): void { + this.#observer?.unsubscribe(); + } } diff --git a/projects/coreui-angular/src/lib/navbar/navbar.module.ts b/projects/coreui-angular/src/lib/navbar/navbar.module.ts index 90d74ad9..8cde570e 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar.module.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar.module.ts @@ -1,6 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; import { NavbarComponent } from './navbar.component'; import { NavbarBrandDirective } from './navbar-brand/navbar-brand.directive'; @@ -9,23 +7,19 @@ import { NavbarTextComponent } from './navbar-text/navbar-text.component'; import { NavbarTogglerDirective } from './navbar-toggler/navbar-toggler.directive'; @NgModule({ - declarations: [ + exports: [ + NavbarBrandDirective, NavbarComponent, NavbarNavComponent, NavbarTextComponent, - NavbarBrandDirective, NavbarTogglerDirective ], - exports: [ + imports: [ + NavbarBrandDirective, NavbarComponent, NavbarNavComponent, NavbarTextComponent, - NavbarBrandDirective, NavbarTogglerDirective - ], - imports: [ - CommonModule, - RouterModule ] }) -export class NavbarModule { } +export class NavbarModule {} diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.spec.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.spec.ts index b7bd6cbd..c1ecfb7a 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.spec.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.spec.ts @@ -8,9 +8,9 @@ describe('OffcanvasBodyComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ OffcanvasBodyComponent ] + imports: [OffcanvasBodyComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('OffcanvasBodyComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('offcanvas-body'); + }); }); diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts index fd30d6d1..ebaf9d95 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts @@ -1,17 +1,9 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-offcanvas-body', - template: ``, - styleUrls: ['./offcanvas-body.component.scss'] + template: '', + styleUrls: ['./offcanvas-body.component.scss'], + host: { class: 'offcanvas-body' } }) -export class OffcanvasBodyComponent { - - @HostBinding('class') - get hostClasses(): any { - return { - 'offcanvas-body': true, - }; - } - -} +export class OffcanvasBodyComponent {} diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.scss b/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.spec.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.spec.ts index 0add318c..5f97acee 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.spec.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.spec.ts @@ -8,9 +8,9 @@ describe('OffcanvasHeaderComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ OffcanvasHeaderComponent ] + imports: [OffcanvasHeaderComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('OffcanvasHeaderComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('offcanvas-header'); + }); }); diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts index 46ec9df4..9bff19fc 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts @@ -1,17 +1,8 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-offcanvas-header', - template: ``, - styleUrls: ['./offcanvas-header.component.scss'] + template: '', + host: { class: 'offcanvas-header' } }) -export class OffcanvasHeaderComponent { - - @HostBinding('class') - get hostClasses(): any { - return { - 'offcanvas-header': true, - }; - } - -} +export class OffcanvasHeaderComponent {} diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.spec.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.spec.ts index d0638f9d..0a8b6d66 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.spec.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.spec.ts @@ -1,8 +1,37 @@ import { OffcanvasTitleDirective } from './offcanvas-title.directive'; +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +@Component({ + template: '
    Test
    ', + imports: [OffcanvasTitleDirective] +}) +class TestComponent {} describe('OffcanvasTitleDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let elementRef: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + elementRef = fixture.debugElement.query(By.directive(OffcanvasTitleDirective)); + + fixture.detectChanges(); // initial binding + }); + it('should create an instance', () => { const directive = new OffcanvasTitleDirective(); expect(directive).toBeTruthy(); }); + + it('should have css classes', () => { + expect(elementRef.nativeElement).toHaveClass('offcanvas-title'); + }); }); diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.ts index 30fb6192..1aa9d36c 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-title/offcanvas-title.directive.ts @@ -1,15 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cOffcanvasTitle]' + selector: '[cOffcanvasTitle]', + host: { class: 'offcanvas-title' } }) -export class OffcanvasTitleDirective { - - @HostBinding('class') - get hostClasses(): any { - return { - 'offcanvas-title': true, - }; - } - -} +export class OffcanvasTitleDirective {} diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.spec.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.spec.ts index 406d3206..9f49c308 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.spec.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.spec.ts @@ -1,38 +1,47 @@ import { Component, DebugElement } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { By } from '@angular/platform-browser'; +import { take } from 'rxjs/operators'; import { OffcanvasToggleDirective } from './offcanvas-toggle.directive'; import { OffcanvasService } from '../offcanvas.service'; @Component({ - template: `` + template: ` `, + imports: [OffcanvasToggleDirective] }) -class TestButtonComponent {} +class TestComponent {} describe('OffcanvasToggleDirective', () => { - - let component: TestButtonComponent; - let fixture: ComponentFixture; - let buttonEl: DebugElement; + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; let service: OffcanvasService; beforeEach(() => { TestBed.configureTestingModule({ - imports: [NoopAnimationsModule], - declarations: [OffcanvasToggleDirective, TestButtonComponent], + imports: [NoopAnimationsModule, OffcanvasToggleDirective, TestComponent], providers: [OffcanvasService] }); - fixture = TestBed.createComponent(TestButtonComponent); + fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; - buttonEl = fixture.debugElement.query(By.css('button')); + debugElement = fixture.debugElement.query(By.css('button')); service = TestBed.inject(OffcanvasService); fixture.detectChanges(); // initial binding }); it('should create an instance', () => { - const directive = new OffcanvasToggleDirective(service); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new OffcanvasToggleDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should toggle offcanvas on click', fakeAsync(() => { + service.offcanvasState$.pipe(take(1)).subscribe((value) => { + expect(value).toEqual({ show: 'toggle', id: 'OffcanvasEnd' }); + }); + debugElement.nativeElement.dispatchEvent(new MouseEvent('click')); + })); }); diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.ts index 4511a506..d58c7ab8 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.ts @@ -1,25 +1,24 @@ -import { Directive, HostListener, Input } from '@angular/core'; +import { Directive, inject, input } from '@angular/core'; import { OffcanvasService } from '../offcanvas.service'; @Directive({ - selector: '[cOffcanvasToggle]' + selector: '[cOffcanvasToggle]', + host: { + '(click)': 'toggleOpen($event)' + } }) export class OffcanvasToggleDirective { + readonly #offcanvasService = inject(OffcanvasService); /** * Html id attr of offcanvas to toggle. - * @type string + * @return string */ - @Input('cOffcanvasToggle') id?: string; - - constructor( - private offcanvasService: OffcanvasService - ) {} + readonly id = input(undefined, { alias: 'cOffcanvasToggle' }); - @HostListener('click', ['$event']) - toggleOpen($event: any): void { + protected toggleOpen($event: MouseEvent): void { $event.preventDefault(); - this.offcanvasService.toggle({ show: 'toggle', id: this.id }); + this.#offcanvasService.toggle({ show: 'toggle', id: this.id() }); } } diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas.module.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas.module.ts index 258edfba..cc136f9a 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas.module.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas.module.ts @@ -1,6 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { A11yModule } from '@angular/cdk/a11y'; import { OffcanvasComponent } from './offcanvas/offcanvas.component'; import { OffcanvasBodyComponent } from './offcanvas-body/offcanvas-body.component'; @@ -11,27 +9,23 @@ import { OffcanvasService } from './offcanvas.service'; import { BackdropService } from '../backdrop/backdrop.service'; @NgModule({ - declarations: [ - OffcanvasComponent, + exports: [ OffcanvasBodyComponent, + OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleDirective, OffcanvasToggleDirective ], - exports: [ - OffcanvasComponent, + imports: [ OffcanvasBodyComponent, + OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleDirective, OffcanvasToggleDirective ], - imports: [ - CommonModule, - A11yModule - ], providers: [ OffcanvasService, BackdropService - ], + ] }) -export class OffcanvasModule { } +export class OffcanvasModule {} diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas.service.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas.service.ts index d4d73d24..ec6a0b6c 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas.service.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas.service.ts @@ -12,12 +12,9 @@ export interface IOffcanvasAction { providedIn: 'root' }) export class OffcanvasService { - private offcanvasState = new Subject(); offcanvasState$ = this.offcanvasState.asObservable(); - constructor() { } - toggle(action: IOffcanvasAction): void { this.offcanvasState.next(action); } diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html index fd9b2771..58481089 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html @@ -1,4 +1,4 @@
    - +
    diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.scss b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.scss index e69de29b..cc36f78b 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.scss +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.scss @@ -0,0 +1,3 @@ +:host { + display: none; +} diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.spec.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.spec.ts new file mode 100644 index 00000000..1a142315 --- /dev/null +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.spec.ts @@ -0,0 +1,76 @@ +import { ComponentFixture, fakeAsync, flushMicrotasks, TestBed, tick } from '@angular/core/testing'; + +import { OffcanvasComponent } from './offcanvas.component'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { ComponentRef } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +describe('OffcanvasComponent', () => { + let component: OffcanvasComponent; + let componentRef: ComponentRef; + let fixture: ComponentFixture; + let document: Document; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, OffcanvasComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(OffcanvasComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + document = TestBed.inject(DOCUMENT); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('offcanvas'); + expect(fixture.nativeElement).toHaveClass('offcanvas-start'); + expect(fixture.nativeElement.getAttribute('id')).toContain('offcanvas-start-'); + }); + + it('should react to visible changes', fakeAsync(() => { + expect(componentRef.instance.visible()).toBeFalse(); + componentRef.setInput('visible', true); + fixture.detectChanges(); + flushMicrotasks(); + expect(componentRef.instance.visible()).toBeTrue(); + expect(fixture.nativeElement.getAttribute('inert')).toBeNull(); + })); + + it('should close offcanvas to Esc keydown event', fakeAsync(() => { + componentRef.setInput('visible', true); + fixture.detectChanges(); + expect(componentRef.instance.visible()).toBeTrue(); + document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' })); + tick(); + fixture.detectChanges(); + expect(componentRef.instance.visible()).toBeFalse(); + expect(fixture.nativeElement.getAttribute('inert')).toBeTruthy(); + })); + + it('should close offcanvas on backdrop click', fakeAsync(() => { + componentRef.setInput('visible', true); + fixture.detectChanges(); + expect(componentRef.instance.visible()).toBeTrue(); + const backdrop = document.querySelector('.offcanvas-backdrop'); + expect(backdrop).not.toBeNull(); + if (backdrop) { + backdrop?.dispatchEvent(new MouseEvent('click')); + tick(); + fixture.detectChanges(); + // expect(componentRef.instance.visible()).toBeFalse(); + // expect(fixture.nativeElement.getAttribute('inert')).toBeTruthy(); + } + })); + + it('should return breakpoint value', fakeAsync(() => { + componentRef.setInput('responsive', 'false'); + fixture.detectChanges(); + expect(fixture.componentInstance.responsiveBreakpoint).toBeFalse(); + })); +}); diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts index c0bdee41..cb437177 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts @@ -1,26 +1,30 @@ +import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; +import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { + booleanAttribute, Component, + computed, + DestroyRef, + effect, ElementRef, - EventEmitter, - HostBinding, - HostListener, - Inject, - Input, - OnChanges, + inject, + input, + linkedSignal, OnDestroy, OnInit, - Output, + output, PLATFORM_ID, - Renderer2, - SimpleChanges, + Renderer2 } from '@angular/core'; -import { animate, state, style, transition, trigger, } from '@angular/animations'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { A11yModule } from '@angular/cdk/a11y'; +import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout'; import { Subscription } from 'rxjs'; +import { filter } from 'rxjs/operators'; -import { OffcanvasService } from '../offcanvas.service'; import { BackdropService } from '../../backdrop/backdrop.service'; -import { DOCUMENT, isPlatformBrowser } from '@angular/common'; +import { ThemeDirective } from '../../shared'; +import { OffcanvasService } from '../offcanvas.service'; let nextId = 0; @@ -29,219 +33,273 @@ let nextId = 0; animations: [ trigger('showHide', [ state( - 'true', + 'visible', style({ - visibility: 'visible', + // visibility: 'visible' }) ), state( - 'false', + 'hidden', style({ - visibility: 'hidden', + // visibility: 'hidden' }) ), - transition('true => false', [animate('300ms')]), - ]), + transition('visible <=> *', [animate('300ms')]) + ]) ], templateUrl: './offcanvas.component.html', styleUrls: ['./offcanvas.component.scss'], exportAs: 'cOffcanvas', + imports: [A11yModule], + hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }], + host: { + ngSkipHydration: 'true', + '[@showHide]': 'this.visible() ? "visible" : "hidden"', + '[attr.id]': 'id()', + '[attr.inert]': 'ariaHidden() || null', + '[attr.role]': 'role()', + '[attr.aria-modal]': 'ariaModal()', + '[attr.tabindex]': 'tabIndex', + '[class]': 'hostClasses()', + '(@showHide.start)': 'animateStart($event)', + '(@showHide.done)': 'animateDone($event)', + '(document:keydown)': 'onKeyDownHandler($event)' + } }) -export class OffcanvasComponent implements OnChanges, OnInit, OnDestroy { - - static ngAcceptInputType_scroll: BooleanInput; - - constructor( - @Inject(DOCUMENT) private document: any, - @Inject(PLATFORM_ID) private platformId: any, - private renderer: Renderer2, - private hostElement: ElementRef, - private offcanvasService: OffcanvasService, - private backdropService: BackdropService - ) { } +export class OffcanvasComponent implements OnInit, OnDestroy { + readonly #document = inject(DOCUMENT); + readonly #platformId = inject(PLATFORM_ID); + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + readonly #offcanvasService = inject(OffcanvasService); + readonly #backdropService = inject(BackdropService); + readonly #breakpointObserver = inject(BreakpointObserver); + readonly #destroyRef = inject(DestroyRef); /** * Apply a backdrop on body while offcanvas is open. - * @type boolean + * @return boolean | 'static' * @default true */ - @Input() backdrop = true; + readonly backdrop = input(true); /** * Closes the offcanvas when escape key is pressed [docs] - * @type boolean + * @return boolean * @default true */ - @Input() keyboard = true; + readonly keyboard = input(true, { transform: booleanAttribute }); /** * Components placement, there’s no default placement. - * @type {'start' | 'end' | 'top' | 'bottom'} + * @return {'start' | 'end' | 'top' | 'bottom'} * @default 'start' */ - @Input() placement: string | 'start' | 'end' | 'top' | 'bottom' = 'start'; + readonly placement = input('start'); /** - * Allow body scrolling while offcanvas is visible. - * @type boolean + * Responsive offcanvas property hides content outside the viewport from a specified breakpoint and down. + * @return boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'; + * @default true + * @since 4.3.10 */ - @Input() - set scroll(value: boolean) { - this._scroll = coerceBooleanProperty(value); - }; - get scroll() { - return this._scroll; - } - private _scroll = false; + readonly responsive = input<(boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl') | undefined>(true); + readonly id = input(`offcanvas-${this.placement()}-${nextId++}`); - @Input() id = `offcanvas-${this.placement}-${nextId++}`; /** * Default role for offcanvas. [docs] - * @type string + * @return string * @default 'dialog' */ - @Input() @HostBinding('attr.role') role = 'dialog'; + readonly role = input('dialog'); /** * Set aria-modal html attr for offcanvas. [docs] - * @type boolean + * @return boolean * @default true */ - @Input() @HostBinding('attr.aria-modal') ariaModal = true; + readonly ariaModal = input(true, { transform: booleanAttribute }); + + #activeBackdrop!: HTMLDivElement; + #backdropClickSubscription!: Subscription; + #layoutChangeSubscription!: Subscription; + + /** + * Allow body scrolling while offcanvas is visible. + * @return boolean + * @default false + */ + readonly scroll = input(false, { transform: booleanAttribute }); /** * Toggle the visibility of offcanvas component. - * @type boolean + * @return boolean + * @default false */ - @Input() - set visible(value: boolean) { - this._visible = coerceBooleanProperty(value); - if (value) { - this.setBackdrop(this.backdrop); + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); + + readonly visible = linkedSignal({ + source: this.visibleInput, + computation: (value) => value + }); + + readonly visibleEffect = effect(() => { + const visible = this.visible(); + if (visible) { + this.setBackdrop(this.backdrop()); this.setFocus(); } else { this.setBackdrop(false); } - this.setScroll(); - this.visibleChange.emit(value); - } - get visible(): boolean { - return this._visible; - } - private _visible!: boolean; + this.layoutChangeSubscribe(visible); + this.visibleChange.emit(visible); + }); /** * Event triggered on visible change. + * @return */ - @Output() visibleChange = new EventEmitter(); - - private activeBackdrop!: any; - - private stateToggleSubscription!: Subscription; - private backdropClickSubscription!: Subscription; + readonly visibleChange = output(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const responsive = this.responsive(); + const placement = this.placement(); + const visible = this.visible(); return { - offcanvas: true, - [`offcanvas-${this.placement}`]: !!this.placement, - show: this.visible, - }; - } + offcanvas: typeof responsive === 'boolean', + [`offcanvas-${responsive}`]: typeof responsive !== 'boolean', + [`offcanvas-${placement}`]: !!placement, + show: visible + } as Record; + }); - @HostBinding('attr.aria-hidden') - get ariaHidden(): boolean | null { - return this.visible ? null : true; - }; + readonly ariaHidden = computed(() => { + return this.visible() ? null : true; + }); - @HostBinding('attr.tabindex') get tabIndex(): string | null { return '-1'; } - @HostBinding('@showHide') - get animateType(): boolean { - return this.visible; + get show(): boolean { + return this.visible(); + } + + set show(value: boolean) { + this.visible.set(value); + } + + get responsiveBreakpoint(): string | false { + const responsive = this.responsive(); + if (typeof responsive !== 'string') { + return false; + } + const element: Element = this.#document.documentElement; + const breakpointValue = + this.#document.defaultView + ?.getComputedStyle(element) + ?.getPropertyValue(`--cui-breakpoint-${responsive.trim()}`) ?? false; + return breakpointValue ? `${parseFloat(breakpointValue.trim()) - 0.02}px` : false; + } + + animateStart(event: AnimationEvent) { + if (event.toState === 'visible') { + if (!this.scroll()) { + this.#backdropService.hideScrollbar(); + } + this.#renderer.addClass(this.#hostElement.nativeElement, 'showing'); + } else { + this.#renderer.addClass(this.#hostElement.nativeElement, 'hiding'); + } + } + + animateDone(event: AnimationEvent) { + setTimeout(() => { + if (event.toState === 'visible') { + this.#renderer.removeClass(this.#hostElement.nativeElement, 'showing'); + } + if (event.toState === 'hidden') { + this.#renderer.removeClass(this.#hostElement.nativeElement, 'hiding'); + this.#renderer.removeStyle(this.#document.body, 'overflow'); + this.#renderer.removeStyle(this.#document.body, 'paddingRight'); + } + }); + this.show = this.visible(); } - @HostListener('document:keydown', ['$event']) onKeyDownHandler(event: KeyboardEvent): void { - if (event.key === 'Escape' && this.keyboard && this.visible) { - this.offcanvasService.toggle({ show: false, id: this.id }); + if (event.key === 'Escape' && this.keyboard() && this.visible() && this.backdrop() !== 'static') { + this.#offcanvasService.toggle({ show: false, id: this.id() }); } } ngOnInit(): void { - this.setScroll(); this.stateToggleSubscribe(); + setTimeout(() => { + // hotfix to avoid offcanvas flicker on the first render + this.#renderer.setStyle(this.#hostElement.nativeElement, 'display', 'flex'); + }); } ngOnDestroy(): void { - this.offcanvasService.toggle({ show: false, id: this.id }); - this.stateToggleSubscribe(false); + this.#offcanvasService.toggle({ show: false, id: this.id() }); } - ngOnChanges(changes: SimpleChanges): void { - if (changes['scroll']) { - this.setScroll(); + setFocus(): void { + if (isPlatformBrowser(this.#platformId)) { + setTimeout(() => this.#hostElement.nativeElement.focus()); } } - private stateToggleSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.stateToggleSubscription = this.offcanvasService.offcanvasState$.subscribe( - (action) => { - if (this === action.offcanvas || this.id === action.id) { - if ('show' in action) { - this.visible = action?.show === 'toggle' ? !this.visible : action.show; - } - } + private stateToggleSubscribe(): void { + this.#offcanvasService.offcanvasState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((action) => { + if (this === action.offcanvas || this.id() === action.id) { + if ('show' in action) { + this.visible.update((value) => (action?.show === 'toggle' ? !value : action.show)); } - ); - } else { - this.stateToggleSubscription.unsubscribe(); - } + } + }); } private backdropClickSubscribe(subscribe: boolean = true): void { if (subscribe) { - this.backdropClickSubscription = this.backdropService.backdropClick$.subscribe( - (clicked) => { - this.offcanvasService.toggle({ show: !clicked, id: this.id }); - } - ); + this.#backdropClickSubscription = this.#backdropService.backdropClick$ + .pipe(takeUntilDestroyed(this.#destroyRef)) + .subscribe((clicked) => { + this.#offcanvasService.toggle({ show: !clicked, id: this.id() }); + }); } else { - this.backdropClickSubscription?.unsubscribe(); + this.#backdropClickSubscription?.unsubscribe(); } } - private setBackdrop(setBackdrop: boolean): void { - if (setBackdrop) { - this.activeBackdrop = this.backdropService.setBackdrop('offcanvas'); - this.backdropClickSubscribe(); - } else { - this.activeBackdrop = this.backdropService.clearBackdrop(this.activeBackdrop); - this.backdropClickSubscribe(false); - } - } - - setFocus(): void { - if (isPlatformBrowser(this.platformId)) { - setTimeout(() => this.hostElement.nativeElement.focus()); - } + protected setBackdrop(setBackdrop: boolean | 'static'): void { + this.#activeBackdrop = !!setBackdrop + ? this.#backdropService.setBackdrop('offcanvas') + : this.#backdropService.clearBackdrop(this.#activeBackdrop); + setBackdrop === true ? this.backdropClickSubscribe() : this.backdropClickSubscribe(false); } - setScroll() { - if (this.visible) { - if (!this.scroll) { - this.renderer.setStyle(this.document.body, 'overflow', 'hidden'); - this.renderer.setStyle(this.document.body, 'paddingRight.px', '0'); + private layoutChangeSubscribe(subscribe: boolean = true): void { + if (subscribe) { + if (!this.responsiveBreakpoint) { + return; } - return; - } - if (!this.scroll) { - this.renderer.removeStyle(this.document.body, 'overflow'); - this.renderer.removeStyle(this.document.body, 'paddingRight'); + + const responsiveBreakpoint = `(max-width: ${this.responsiveBreakpoint})`; + + const layoutChanges = this.#breakpointObserver.observe([responsiveBreakpoint]); + + this.#layoutChangeSubscription = layoutChanges + .pipe( + filter((breakpointState) => !breakpointState.matches), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe((breakpointState: BreakpointState) => { + this.visible.set(breakpointState.matches); + }); + } else { + this.#layoutChangeSubscription?.unsubscribe(); } } } diff --git a/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.spec.ts b/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.spec.ts index 346698b5..a07ee0c1 100644 --- a/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.spec.ts +++ b/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.spec.ts @@ -8,9 +8,8 @@ describe('PaginationItemComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [PageItemComponent] - }) - .compileComponents(); + imports: [PageItemComponent] + }).compileComponents(); }); beforeEach(() => { @@ -22,4 +21,8 @@ describe('PaginationItemComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('page-item'); + }); }); diff --git a/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts b/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts index a85c1c6b..52e2301b 100644 --- a/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts +++ b/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts @@ -3,8 +3,7 @@ import { PageItemDirective } from './page-item.directive'; @Component({ selector: 'c-page-item', - template: ``, + template: '', styleUrls: ['./page-item.component.scss'] }) -export class PageItemComponent extends PageItemDirective { } - +export class PageItemComponent extends PageItemDirective {} diff --git a/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.spec.ts b/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.spec.ts index 9842bddf..790e0030 100644 --- a/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.spec.ts +++ b/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.spec.ts @@ -1,18 +1,60 @@ +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { Component, ComponentRef, DebugElement, input, Renderer2 } from '@angular/core'; +import { provideRouter, RouterLink } from '@angular/router'; + +import { PageLinkDirective } from '../page-link/page-link.directive'; +import { PageItemComponent } from './page-item.component'; import { PageItemDirective } from './page-item.directive'; -import { TestBed } from '@angular/core/testing'; -import { Renderer2 } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +@Component({ + selector: 'c-test', + imports: [PageItemComponent, PageLinkDirective, PageItemComponent, PageLinkDirective, RouterLink], + template: ` + + Previous + + ` +}) +export class TestComponent { + readonly disabled = input(false); +} describe('PageItemDirective', () => { - let renderer: Renderer2; + let component: TestComponent; + let componentRef: ComponentRef; + let fixture: ComponentFixture; + let debugElement: DebugElement; beforeEach(() => { TestBed.configureTestingModule({ - imports: [Renderer2], - providers: [Renderer2] - }); + imports: [TestComponent], + providers: [Renderer2, provideRouter([])] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + debugElement = fixture.debugElement.query(By.directive(PageLinkDirective)); }); + it('should create an instance', () => { - const directive = new PageItemDirective(renderer); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new PageItemDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should toggle disable state for the component', fakeAsync(() => { + expect(debugElement.nativeElement.getAttribute('aria-disabled')).toBeNull(); + expect(debugElement.nativeElement.getAttribute('tabindex')).toBeNull(); + componentRef.setInput('disabled', true); + tick(); + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('aria-disabled')).toBe('true'); + expect(debugElement.nativeElement.getAttribute('tabindex')).toBe('-1'); + componentRef.setInput('disabled', false); + tick(); + fixture.detectChanges(); + })); }); diff --git a/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.ts b/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.ts index 241b49a0..7e85ceb8 100644 --- a/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.ts +++ b/projects/coreui-angular/src/lib/pagination/page-item/page-item.directive.ts @@ -1,74 +1,58 @@ -import { - AfterContentInit, - ContentChild, - Directive, - ElementRef, - HostBinding, - Input, - OnChanges, - Renderer2, SimpleChanges -} from '@angular/core'; +import { computed, contentChild, Directive, effect, ElementRef, inject, input, Renderer2 } from '@angular/core'; import { PageLinkDirective } from '../page-link/page-link.directive'; @Directive({ - selector: '[cPageItem]' + selector: '[cPageItem]', + host: { + class: 'page-item', + '[class]': 'hostClasses()', + '[attr.aria-current]': 'ariaCurrent()' + } }) -export class PageItemDirective implements AfterContentInit, OnChanges { +export class PageItemDirective { + readonly #renderer = inject(Renderer2); /** * Toggle the active state for the component. - * @type boolean + * @return boolean */ - @Input() active?: boolean; + readonly active = input(); + /** * Toggle the disabled state for the component. - * @type boolean + * @return boolean */ - @Input() disabled?: boolean; + readonly disabled = input(); - @HostBinding('attr.aria-current') - get ariaCurrent(): string | null { - return this.active ? 'page' : null; - } + readonly ariaCurrent = computed(() => { + return this.active() ? 'page' : null; + }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { 'page-item': true, - disabled: this.disabled, - active: this.active, - }; - } - - @ContentChild(PageLinkDirective, { read: ElementRef }) pageLinkElementRef!: ElementRef; - - constructor( - private renderer: Renderer2 - ) { } - - ngAfterContentInit(): void { - this.setAttributes(); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['disabled']) { - this.setAttributes(); - } - } - - setAttributes(): void { - if (!this.pageLinkElementRef) { - return + disabled: this.disabled(), + active: this.active() + } as Record; + }); + + readonly pageLinkElementRef = contentChild(PageLinkDirective, { read: ElementRef }); + + readonly pageLinkElementRefEffect = effect(() => { + const pageLinkElementRef = this.pageLinkElementRef(); + const disabled = this.disabled(); + if (!pageLinkElementRef) { + return; } - const pageLinkElement = this.pageLinkElementRef.nativeElement; + const pageLinkElement = pageLinkElementRef.nativeElement; - if (this.disabled) { - this.renderer.setAttribute(pageLinkElement, 'aria-disabled', 'true'); - this.renderer.setAttribute(pageLinkElement, 'tabindex', '-1'); + if (disabled) { + this.#renderer.setAttribute(pageLinkElement, 'aria-disabled', 'true'); + this.#renderer.setAttribute(pageLinkElement, 'tabindex', '-1'); } else { - this.renderer.removeAttribute(pageLinkElement, 'aria-disabled'); - this.renderer.removeAttribute(pageLinkElement, 'tabindex'); + this.#renderer.removeAttribute(pageLinkElement, 'aria-disabled'); + this.#renderer.removeAttribute(pageLinkElement, 'tabindex'); } - } + }); } diff --git a/projects/coreui-angular/src/lib/pagination/page-link/page-link.directive.ts b/projects/coreui-angular/src/lib/pagination/page-link/page-link.directive.ts index 63bbdecc..fd053286 100644 --- a/projects/coreui-angular/src/lib/pagination/page-link/page-link.directive.ts +++ b/projects/coreui-angular/src/lib/pagination/page-link/page-link.directive.ts @@ -1,14 +1,7 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ - selector: '[cPageLink]' + selector: '[cPageLink]', + host: { class: 'page-link' } }) -export class PageLinkDirective { - - @HostBinding('class') - get hostClasses(): any { - return { - 'page-link': true, - }; - } -} +export class PageLinkDirective {} diff --git a/projects/coreui-angular/src/lib/pagination/pagination.module.ts b/projects/coreui-angular/src/lib/pagination/pagination.module.ts index b56e32f6..f8aa1fa0 100644 --- a/projects/coreui-angular/src/lib/pagination/pagination.module.ts +++ b/projects/coreui-angular/src/lib/pagination/pagination.module.ts @@ -1,25 +1,21 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { PaginationComponent } from './pagination/pagination.component'; import { PageItemComponent } from './page-item/page-item.component'; import { PageItemDirective } from './page-item/page-item.directive'; import { PageLinkDirective } from './page-link/page-link.directive'; @NgModule({ - declarations: [ - PaginationComponent, - PageItemComponent, - PageItemDirective, - PageLinkDirective - ], exports: [ - PaginationComponent, PageItemComponent, PageItemDirective, - PageLinkDirective + PageLinkDirective, + PaginationComponent ], imports: [ - CommonModule + PageItemComponent, + PageItemDirective, + PageLinkDirective, + PaginationComponent ] }) export class PaginationModule {} diff --git a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html index 24e870d8..fe5b272c 100644 --- a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html +++ b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html @@ -1,3 +1,3 @@ -
      - +
        +
      diff --git a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.scss b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.spec.ts b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.spec.ts index 258ba5c1..9bdf3665 100644 --- a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.spec.ts +++ b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.spec.ts @@ -1,25 +1,33 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PaginationComponent } from './pagination.component'; +import { ElementRef } from '@angular/core'; +import { By } from '@angular/platform-browser'; describe('PaginationComponent', () => { let component: PaginationComponent; let fixture: ComponentFixture; + let elementRef: ElementRef; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ PaginationComponent ] + imports: [PaginationComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(PaginationComponent); component = fixture.componentInstance; + elementRef = fixture.debugElement.query(By.css('ul')); fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(elementRef.nativeElement).toHaveClass('pagination'); + }); }); diff --git a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.ts b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.ts index 52c73539..e1cff52c 100644 --- a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.ts +++ b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.ts @@ -1,36 +1,39 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, computed, input } from '@angular/core'; +import { NgClass } from '@angular/common'; @Component({ selector: 'c-pagination', templateUrl: './pagination.component.html', - styleUrls: ['./pagination.component.scss'] + imports: [NgClass], + host: { + '[attr.role]': 'role()' + } }) export class PaginationComponent { - /** * Set the alignment of pagination components. * @values 'start', 'center', 'end' */ - @Input() align: 'start' | 'center' | 'end' | '' = ''; + readonly align = input<'start' | 'center' | 'end' | ''>(''); /** * Size the component small or large. * @values 'sm', 'lg' */ - @Input() size?: 'sm' | 'lg'; + readonly size = input<'sm' | 'lg'>(); /** * Default role for pagination. [docs] - * @type string + * @return string * @default 'navigation' */ - @HostBinding('attr.role') - @Input() role = 'navigation'; + readonly role = input('navigation'); - get paginationClass(): any { + readonly paginationClass = computed(() => { + const size = this.size(); + const align = this.align(); return { pagination: true, - [`pagination-${this.size}`]: !!this.size, - [`justify-content-${this.align}`]: !!this.align - }; - } - + [`pagination-${size}`]: !!size, + [`justify-content-${align}`]: !!align + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.spec.ts b/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.spec.ts index f3c40cc3..0488fac2 100644 --- a/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.spec.ts +++ b/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.spec.ts @@ -1,8 +1,11 @@ +import { TestBed } from '@angular/core/testing'; import { PlaceholderAnimationDirective } from './placeholder-animation.directive'; describe('PlaceholderAnimationDirective', () => { it('should create an instance', () => { - const directive = new PlaceholderAnimationDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new PlaceholderAnimationDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.ts b/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.ts index 1663610c..212ff46f 100644 --- a/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.ts +++ b/projects/coreui-angular/src/lib/placeholder/placeholder-animation.directive.ts @@ -1,31 +1,27 @@ -import { AfterContentInit, ContentChild, Directive, HostBinding, Input } from '@angular/core'; +import { computed, contentChild, Directive, input, InputSignal } from '@angular/core'; import { PlaceholderDirective } from './placeholder.directive'; @Directive({ - selector: '[cPlaceholderAnimation]' + selector: '[cPlaceholderAnimation]', + host: { + '[class]': 'hostClasses()' + } }) -export class PlaceholderAnimationDirective implements AfterContentInit { - - constructor() { } - +export class PlaceholderAnimationDirective { /** * Animation type for placeholder * @type 'glow' | 'wave' * @default undefined */ - @Input('cPlaceholderAnimation') animation?: 'glow' | 'wave'; - - @HostBinding('class') - get hostClasses(): any { - return { - [`placeholder-${this.animation}`]: this.animate && !!this.animation - }; - } + readonly animation: InputSignal<'glow' | 'wave' | undefined> = input<'glow' | 'wave' | undefined>(undefined, { + alias: 'cPlaceholderAnimation' + }); - @ContentChild(PlaceholderDirective) placeholder!: PlaceholderDirective; - private animate: boolean = false; + readonly placeholder = contentChild(PlaceholderDirective); - ngAfterContentInit() { - this.animate = this.placeholder?.visible; - } + readonly hostClasses = computed(() => { + return { + [`placeholder-${this.animation()}`]: this.placeholder()?.visible() && !!this.animation() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/placeholder/placeholder.directive.spec.ts b/projects/coreui-angular/src/lib/placeholder/placeholder.directive.spec.ts index 9a7578ed..48b76b00 100644 --- a/projects/coreui-angular/src/lib/placeholder/placeholder.directive.spec.ts +++ b/projects/coreui-angular/src/lib/placeholder/placeholder.directive.spec.ts @@ -1,8 +1,63 @@ +import { Component, ComponentRef, DebugElement, input } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; import { PlaceholderDirective } from './placeholder.directive'; +import { PlaceholderAnimationDirective } from './placeholder-animation.directive'; + +@Component({ + template: ` +

      + +

      + `, + imports: [PlaceholderDirective, PlaceholderAnimationDirective] +}) +class TestComponent { + readonly visible = input(true); + readonly animation = input<'glow' | 'wave' | undefined>(undefined); +} describe('PlaceholderDirective', () => { + let component: TestComponent; + let componentRef: ComponentRef; + let fixture: ComponentFixture; + let debugElement: DebugElement; + let wrapperElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + debugElement = fixture.debugElement.query(By.directive(PlaceholderDirective)); + wrapperElement = fixture.debugElement.query(By.directive(PlaceholderAnimationDirective)); + }); + it('should create an instance', () => { - const directive = new PlaceholderDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new PlaceholderDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should toggle visibility for the placeholder', () => { + componentRef.setInput('visible', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('placeholder'); + expect(debugElement.nativeElement).toHaveClass('placeholder-sm'); + componentRef.setInput('visible', false); + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('aria-hidden')).toBe('true'); + expect(debugElement.nativeElement).not.toHaveClass('placeholder'); + }); + + it('should toggle animation for the placeholder', () => { + expect(wrapperElement.nativeElement).not.toHaveClass('placeholder-glow'); + componentRef.setInput('animation', 'glow'); + fixture.detectChanges(); + expect(wrapperElement.nativeElement).toHaveClass('placeholder-glow'); }); }); diff --git a/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts b/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts index 351d2ced..637d0d4c 100644 --- a/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts +++ b/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts @@ -1,45 +1,37 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, computed, Directive, input, InputSignalWithTransform } from '@angular/core'; @Directive({ selector: '[cPlaceholder]', - exportAs: 'cPlaceholder' + exportAs: 'cPlaceholder', + host: { + '[class]': 'hostClasses()', + '[attr.aria-hidden]': 'ariaHidden()' + } }) export class PlaceholderDirective { - - static ngAcceptInputType_visible: BooleanInput; - - constructor() { } - /** * placeholder toggler * @type boolean - * @default true + * @default false */ - @Input('cPlaceholder') - set visible(value: boolean) { - this._visible = coerceBooleanProperty(value); - } - get visible() { - return this._visible; - } - private _visible: boolean = false; + readonly visible: InputSignalWithTransform = input(false, { + transform: booleanAttribute, + alias: 'cPlaceholder' + }); /** - * Size the placeholder extra small, small, large. + * Size the placeholder xs, small, large. */ - @Input('cPlaceholderSize') size?: 'xs' | 'sm' | 'lg'; + readonly size = input<'xs' | 'sm' | 'lg' | undefined>(undefined, { alias: 'cPlaceholderSize' }); - @HostBinding('attr.aria-hidden') - get ariaHidden(): boolean | null { - return this.visible ? null : true; - }; + readonly ariaHidden = computed(() => { + return this.visible() ? null : true; + }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { - 'placeholder': this.visible, - [`placeholder-${this.size}`]: !!this.size - }; - } + placeholder: this.visible(), + [`placeholder-${this.size()}`]: !!this.size() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/placeholder/placeholder.module.ts b/projects/coreui-angular/src/lib/placeholder/placeholder.module.ts index 73943ac9..50fc3dbc 100644 --- a/projects/coreui-angular/src/lib/placeholder/placeholder.module.ts +++ b/projects/coreui-angular/src/lib/placeholder/placeholder.module.ts @@ -1,16 +1,12 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { PlaceholderDirective } from './placeholder.directive'; import { PlaceholderAnimationDirective } from './placeholder-animation.directive'; @NgModule({ - declarations: [ + imports: [ PlaceholderDirective, PlaceholderAnimationDirective ], - imports: [ - CommonModule - ], exports: [ PlaceholderDirective, PlaceholderAnimationDirective diff --git a/projects/coreui-angular/src/lib/popover/popover.directive.spec.ts b/projects/coreui-angular/src/lib/popover/popover.directive.spec.ts index d0cbe224..74857979 100644 --- a/projects/coreui-angular/src/lib/popover/popover.directive.spec.ts +++ b/projects/coreui-angular/src/lib/popover/popover.directive.spec.ts @@ -1,17 +1,97 @@ -import { ChangeDetectorRef, ElementRef, Renderer2, ViewContainerRef } from '@angular/core'; -import { ListenersService } from '../services/listeners.service'; +import { DOCUMENT } from '@angular/common'; +import { + ChangeDetectorRef, + Component, + ComponentRef, + DebugElement, + ElementRef, + Renderer2, + ViewContainerRef +} from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { ListenersService } from '../services'; import { PopoverDirective } from './popover.directive'; +import { Triggers } from '../coreui.types'; + +@Component({ + template: '', + imports: [PopoverDirective] +}) +export class TestComponent { + content = 'Test'; + visible = false; + trigger: Triggers[] = ['hover', 'click']; +} + +class MockElementRef extends ElementRef {} describe('PopoverDirective', () => { + let component: TestComponent; + let componentRef: ComponentRef; + let fixture: ComponentFixture; + let debugElement: DebugElement; let document: Document; - let renderer: Renderer2; - let hostElement: ElementRef; - let viewContainerRef: ViewContainerRef; - let changeDetectorRef: ChangeDetectorRef; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [ + // IntersectionService, + Renderer2, + ListenersService, + { provide: ElementRef, useClass: MockElementRef }, + ViewContainerRef, + ChangeDetectorRef + ] + }).compileComponents(); + document = TestBed.inject(DOCUMENT); + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(PopoverDirective)); + fixture.autoDetectChanges(); + }); it('should create an instance', () => { - const listenersService = new ListenersService(renderer); - const directive = new PopoverDirective(document, renderer, hostElement, viewContainerRef, listenersService, changeDetectorRef); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new PopoverDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should have css classes', fakeAsync(() => { + expect(document.querySelector('.popover.show')).toBeNull(); + component.visible = true; + fixture.detectChanges(); + tick(500); + expect(document.querySelector('.popover.show')).toBeTruthy(); + component.visible = false; + fixture.detectChanges(); + tick(500); + expect(document.querySelector('.popover.show')).toBeNull(); + })); + + it('should set popover on and off', fakeAsync(() => { + fixture.autoDetectChanges(); + component.visible = false; + expect(document.querySelector('.popover.show')).toBeNull(); + debugElement.nativeElement.dispatchEvent(new Event('mouseenter')); + tick(500); + expect(document.querySelector('.popover.show')).toBeTruthy(); + debugElement.nativeElement.dispatchEvent(new Event('mouseleave')); + tick(500); + expect(document.querySelector('.popover.show')).toBeNull(); + })); + + it('should toggle popover', fakeAsync(() => { + fixture.autoDetectChanges(); + component.visible = false; + expect(document.querySelector('.popover.show')).toBeNull(); + debugElement.nativeElement.dispatchEvent(new Event('click')); + tick(500); + expect(document.querySelector('.popover.show')).toBeTruthy(); + debugElement.nativeElement.dispatchEvent(new Event('click')); + tick(500); + expect(document.querySelector('.popover.show')).toBeNull(); + })); }); diff --git a/projects/coreui-angular/src/lib/popover/popover.directive.ts b/projects/coreui-angular/src/lib/popover/popover.directive.ts index b26e59fd..a0370f4e 100644 --- a/projects/coreui-angular/src/lib/popover/popover.directive.ts +++ b/projects/coreui-angular/src/lib/popover/popover.directive.ts @@ -1,83 +1,116 @@ +import { DOCUMENT } from '@angular/common'; import { + AfterViewInit, ChangeDetectorRef, ComponentRef, + computed, + DestroyRef, Directive, + effect, ElementRef, - HostBinding, - Inject, - Input, - OnChanges, + inject, + input, + model, OnDestroy, OnInit, Renderer2, - SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core'; -import { DOCUMENT } from '@angular/common'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { debounceTime, filter, finalize } from 'rxjs/operators'; import { createPopper, Instance, Options } from '@popperjs/core'; import { Triggers } from '../coreui.types'; +import { IListenersConfig, IntersectionService, ListenersService } from '../services'; +import { ElementRefDirective } from '../shared'; import { PopoverComponent } from './popover/popover.component'; -import { IListenersConfig, ListenersService } from '../services/listeners.service'; @Directive({ selector: '[cPopover]', exportAs: 'cPopover', - providers: [ListenersService] + providers: [ListenersService, IntersectionService], + host: { '[attr.aria-describedby]': 'ariaDescribedBy' } }) -export class PopoverDirective implements OnChanges, OnDestroy, OnInit { +export class PopoverDirective implements OnDestroy, OnInit, AfterViewInit { + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + readonly #viewContainerRef = inject(ViewContainerRef); + readonly #listenersService = inject(ListenersService); + readonly #changeDetectorRef = inject(ChangeDetectorRef); + readonly #intersectionService = inject(IntersectionService); + readonly #destroyRef = inject(DestroyRef); + readonly #document = inject(DOCUMENT); /** * Content of popover - * @type {string | TemplateRef} + * @return {string | TemplateRef} */ - @Input('cPopover') content: string | TemplateRef = ''; + readonly content = input | undefined>(undefined, { alias: 'cPopover' }); + + readonly #contentEffect = effect(() => { + if (this.content()) { + this.destroyTooltipElement(); + } + }); /** * Optional popper Options object, takes precedence over cPopoverPlacement prop - * @type Partial + * @return Partial */ - @Input('cPopoverOptions') - set popperOptions(value: Partial) { - this._popperOptions = { ...this._popperOptions, placement: this.placement, ...value }; - }; + readonly popperOptions = input>({}, { alias: 'cPopoverOptions' }); - get popperOptions(): Partial { - return { placement: this.placement, ...this._popperOptions }; - } + readonly #popperOptionsEffect = effect(() => { + this._popperOptions = { + ...this._popperOptions, + placement: this.placement(), + ...this.popperOptions() + }; + }); + + readonly popperOptionsComputed = computed(() => { + return { placement: this.placement(), ...this._popperOptions }; + }); /** * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property. + * @return: 'top' | 'bottom' | 'left' | 'right' + * @default: 'top' */ - @Input('cPopoverPlacement') placement: 'top' | 'bottom' | 'left' | 'right' = 'top'; + readonly placement = input<'top' | 'bottom' | 'left' | 'right'>('top', { alias: 'cPopoverPlacement' }); + + /** + * ElementRefDirective for positioning the tooltip on reference element + * @return: ElementRefDirective + * @default: undefined + */ + readonly reference = input(undefined, { alias: 'cTooltipRef' }); + + readonly referenceRef = computed(() => this.reference()?.elementRef ?? this.#hostElement); + /** * Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them. - * @type {'hover' | 'focus' | 'click'} + * @return: Triggers | Triggers[] */ - @Input('cPopoverTrigger') trigger?: Triggers | Triggers[] = 'hover'; + readonly trigger = input('hover', { alias: 'cPopoverTrigger' }); /** * Toggle the visibility of popover component. + * @return boolean */ - @Input('cPopoverVisible') - set visible(value: boolean) { - this._visible = value; - } - - get visible() { - return this._visible; - } + readonly visible = model(false, { alias: 'cPopoverVisible' }); - private _visible = false; + readonly #visibleEffect = effect(() => { + this.visible() ? this.addTooltipElement() : this.removeTooltipElement(); + }); - @HostBinding('attr.aria-describedby') get ariaDescribedBy(): string | null { - return this.popoverId ? this.popoverId : null; + get ariaDescribedBy(): string | null { + return this.tooltipId ? this.tooltipId : null; } - private popover!: HTMLDivElement; - private popoverId!: string; - private popoverRef!: ComponentRef; + private tooltip!: HTMLDivElement; + private tooltipId!: string; + private tooltipRef!: ComponentRef; private popperInstance!: Instance; private _popperOptions: Partial = { @@ -85,30 +118,19 @@ export class PopoverDirective implements OnChanges, OnDestroy, OnInit { { name: 'offset', options: { - offset: [0, 8] + offset: [0, 9] } } ] }; - constructor( - @Inject(DOCUMENT) private document: Document, - private renderer: Renderer2, - private hostElement: ElementRef, - private viewContainerRef: ViewContainerRef, - private listenersService: ListenersService, - private changeDetectorRef: ChangeDetectorRef - ) {} - - ngOnChanges(changes: SimpleChanges): void { - if (changes['visible']) { - changes['visible'].currentValue ? this.addPopoverElement() : this.removePopoverElement(); - } + ngAfterViewInit(): void { + this.intersectionServiceSubscribe(); } ngOnDestroy(): void { this.clearListeners(); - this.destroyPopoverElement(); + this.destroyTooltipElement(); } ngOnInit(): void { @@ -117,102 +139,116 @@ export class PopoverDirective implements OnChanges, OnDestroy, OnInit { private setListeners(): void { const config: IListenersConfig = { - hostElement: this.hostElement, - trigger: this.trigger, + hostElement: this.#hostElement, + trigger: this.trigger(), callbackToggle: () => { - this.visible = !this.visible; - this.visible ? this.addPopoverElement() : this.removePopoverElement(); + this.visible.update((visible) => !visible); }, callbackOff: () => { - this.visible = false; - this.removePopoverElement(); + this.visible.set(false); }, callbackOn: () => { - this.visible = true; - this.addPopoverElement(); + this.visible.set(true); } }; - this.listenersService.setListeners(config); + this.#listenersService.setListeners(config); } private clearListeners(): void { - this.listenersService.clearListeners(); + this.#listenersService.clearListeners(); + } + + private intersectionServiceSubscribe(): void { + this.#intersectionService.createIntersectionObserver(this.referenceRef()); + this.#intersectionService.intersecting$ + .pipe( + filter((next) => next.hostElement === this.referenceRef()), + debounceTime(100), + finalize(() => { + this.#intersectionService.unobserve(this.referenceRef()); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe((next) => { + this.visible.set(next.isIntersecting ? this.visible() : false); + }); } private getUID(prefix: string): string { let uid = prefix ?? 'random-id'; do { uid = `${prefix}-${Math.floor(Math.random() * 1000000).toString(10)}`; - } while (this.document.getElementById(uid)); + } while (this.#document.getElementById(uid)); return uid; } - private createPopoverElement(): void { - if (!this.popoverRef) { - this.popoverRef = this.viewContainerRef.createComponent(PopoverComponent); + private createTooltipElement(): void { + if (!this.tooltipRef) { + this.tooltipRef = this.#viewContainerRef.createComponent(PopoverComponent); // this.viewContainerRef.detach(); } } - private destroyPopoverElement(): void { - this.popover?.remove(); - this.popoverRef?.destroy(); + private destroyTooltipElement(): void { + this.tooltip?.remove(); + this.tooltipRef?.destroy(); // @ts-ignore - this.popoverRef = undefined; + this.tooltipRef = undefined; this.popperInstance?.destroy(); - this.viewContainerRef?.detach(); - this.viewContainerRef?.clear(); + this.#viewContainerRef?.detach(); + this.#viewContainerRef?.clear(); } - private addPopoverElement(): void { - if (!this.popoverRef) { - this.createPopoverElement(); + private addTooltipElement(): void { + if (!this.content()) { + this.destroyTooltipElement(); + return; + } + + if (!this.tooltipRef) { + this.createTooltipElement(); } - this.popoverRef.instance.content = this.content; - this.popover = this.popoverRef.location.nativeElement; - this.renderer.addClass(this.popover, 'd-none'); - this.renderer.addClass(this.popover, 'fade'); + + this.tooltipRef?.setInput('content', this.content() ?? ''); + + this.tooltip = this.tooltipRef?.location.nativeElement; + this.#renderer.addClass(this.tooltip, 'd-none'); + this.#renderer.addClass(this.tooltip, 'fade'); this.popperInstance?.destroy(); - setTimeout(() => { - this.popperInstance = createPopper( - this.hostElement.nativeElement, - this.popover, - { ...this.popperOptions } - ); - this.viewContainerRef.insert(this.popoverRef.hostView); - this.renderer.appendChild(this.document.body, this.popover); - if (!this.visible) { - this.removePopoverElement(); - return; - } - setTimeout(() => { - this.popoverId = this.getUID('popover'); - this.popoverRef.instance.id = this.popoverId; - if (!this.visible) { - this.removePopoverElement(); - return; - } - this.renderer.removeClass(this.popover, 'd-none'); - this.popoverRef.instance.visible = this.visible; - this.popperInstance.forceUpdate(); - this.changeDetectorRef.markForCheck(); - }, 100); + this.#viewContainerRef.insert(this.tooltipRef.hostView); + this.#renderer.appendChild(this.#document.body, this.tooltip); + + this.popperInstance = createPopper(this.referenceRef().nativeElement, this.tooltip, { + ...this.popperOptionsComputed() }); + + if (!this.visible()) { + this.removeTooltipElement(); + return; + } + setTimeout(() => { + this.tooltipId = this.getUID('popover'); + this.tooltipRef?.setInput('id', this.tooltipId); + this.#renderer.removeClass(this.tooltip, 'd-none'); + this.tooltipRef?.setInput('visible', this.visible()); + this.popperInstance?.forceUpdate(); + this.#changeDetectorRef?.markForCheck(); + }, 100); } - private removePopoverElement(): void { - this.popoverId = ''; - if (!this.popoverRef) { + private removeTooltipElement(): void { + this.tooltipId = ''; + if (!this.tooltipRef) { return; } - this.popoverRef.instance.visible = false; - this.popoverRef.instance.id = undefined; - this.changeDetectorRef.markForCheck(); + this.tooltipRef.setInput('visible', false); + this.tooltipRef.setInput('id', undefined); + this.#changeDetectorRef.markForCheck(); setTimeout(() => { - this.viewContainerRef.detach(); + this.#viewContainerRef?.detach(); }, 300); } } diff --git a/projects/coreui-angular/src/lib/popover/popover.module.ts b/projects/coreui-angular/src/lib/popover/popover.module.ts index bc695d7e..4ea29a42 100644 --- a/projects/coreui-angular/src/lib/popover/popover.module.ts +++ b/projects/coreui-angular/src/lib/popover/popover.module.ts @@ -1,20 +1,15 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { PopoverDirective } from './popover.directive'; import { PopoverComponent } from './popover/popover.component'; - @NgModule({ - declarations: [ - PopoverDirective, - PopoverComponent - ], exports: [ PopoverDirective, PopoverComponent ], imports: [ - CommonModule + PopoverDirective, + PopoverComponent ] }) -export class PopoverModule { } +export class PopoverModule {} diff --git a/projects/coreui-angular/src/lib/popover/popover/popover.component.html b/projects/coreui-angular/src/lib/popover/popover/popover.component.html index 8a24a3a9..afa937fe 100644 --- a/projects/coreui-angular/src/lib/popover/popover/popover.component.html +++ b/projects/coreui-angular/src/lib/popover/popover/popover.component.html @@ -1,4 +1,4 @@ -
      - +
      + diff --git a/projects/coreui-angular/src/lib/popover/popover/popover.component.spec.ts b/projects/coreui-angular/src/lib/popover/popover/popover.component.spec.ts index 4b620acf..53ba179b 100644 --- a/projects/coreui-angular/src/lib/popover/popover/popover.component.spec.ts +++ b/projects/coreui-angular/src/lib/popover/popover/popover.component.spec.ts @@ -8,9 +8,9 @@ describe('PopoverComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ PopoverComponent ] + imports: [PopoverComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,10 @@ describe('PopoverComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('popover'); + expect(fixture.nativeElement).toHaveClass('fade'); + expect(fixture.nativeElement).toHaveClass('bs-popover-auto'); + }); }); diff --git a/projects/coreui-angular/src/lib/popover/popover/popover.component.ts b/projects/coreui-angular/src/lib/popover/popover/popover.component.ts index 6b5e62ff..70175099 100644 --- a/projects/coreui-angular/src/lib/popover/popover/popover.component.ts +++ b/projects/coreui-angular/src/lib/popover/popover/popover.component.ts @@ -1,73 +1,68 @@ import { - AfterViewInit, + booleanAttribute, Component, - HostBinding, - Input, - OnChanges, + computed, + effect, + inject, + input, OnDestroy, Renderer2, - SimpleChanges, TemplateRef, - ViewChild, + viewChild, ViewContainerRef } from '@angular/core'; +import { NgClass } from '@angular/common'; @Component({ selector: 'c-popover', templateUrl: './popover.component.html', + imports: [NgClass], + host: { + class: 'popover fade bs-popover-auto', + '[class]': 'hostClasses()', + '[attr.role]': 'role()', + '[attr.id]': 'id()' + } }) -export class PopoverComponent implements AfterViewInit, OnChanges, OnDestroy { +export class PopoverComponent implements OnDestroy { + readonly renderer = inject(Renderer2); /** * Content of popover - * @type {string | TemplateRef} + * @return {string | TemplateRef} */ - @Input() content: string | TemplateRef = ''; + readonly content = input>(''); + + readonly #contentEffect = effect(() => { + this.updateView(this.content()); + }); + /** * Toggle the visibility of popover component. - * @type boolean + * @return boolean */ - @Input() visible = false; - @Input() @HostBinding('attr.id') id?: string; - @Input() @HostBinding('attr.role') role = 'tooltip'; + readonly visible = input(false, { transform: booleanAttribute }); + readonly id = input(); + readonly role = input('tooltip'); - @ViewChild('popoverTemplate', { read: ViewContainerRef }) viewContainerRef!: ViewContainerRef; + readonly viewContainerRef = viewChild('popoverTemplate', { read: ViewContainerRef }); private textNode!: Text; - constructor( - private renderer: Renderer2 - ) { } - - @HostBinding('class') - get hostClasses(): { [klass: string]: any; } { + readonly hostClasses = computed(() => { return { popover: true, fade: true, - show: this.visible, + show: this.visible(), 'bs-popover-auto': true - }; - } - - ngAfterViewInit(): void { - setTimeout(() => { - this.updateView(this.content); - }); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['content']) { - setTimeout(() => { - this.updateView(this.content); - }); - } - } + } as Record; + }); ngOnDestroy(): void { this.clear(); } private clear(): void { - this.viewContainerRef?.clear(); + this.viewContainerRef()?.clear(); if (!!this.textNode) { this.renderer.removeChild(this.textNode.parentNode, this.textNode); } @@ -81,15 +76,15 @@ export class PopoverComponent implements AfterViewInit, OnChanges, OnDestroy { } if (content instanceof TemplateRef) { - this.viewContainerRef.createEmbeddedView(content); + this.viewContainerRef()?.createEmbeddedView(content); } else { - this.textNode = this.renderer.createText(content); - const popoverBody = this.renderer.createElement('div'); - this.renderer.addClass(popoverBody, 'popover-body'); - this.renderer.appendChild(popoverBody, this.textNode); + const textNodeContent = this.renderer.createText(content); + this.textNode = this.renderer.createElement('div'); + this.renderer.addClass(this.textNode, 'popover-body'); + this.renderer.appendChild(this.textNode, textNodeContent); - const element = this.viewContainerRef.element.nativeElement; - this.renderer.appendChild(element.parentNode, popoverBody); + const element = this.viewContainerRef()?.element.nativeElement; + this.renderer.appendChild(element.parentNode, this.textNode); } } } diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts b/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts index 011b1245..6441107e 100644 --- a/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts +++ b/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts @@ -1,25 +1,64 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentRef } from '@angular/core'; import { ProgressBarComponent } from './progress-bar.component'; +import { ProgressBarDirective } from './progress-bar.directive'; +import { ProgressService } from './progress.service'; describe('ProgressBarComponent', () => { let component: ProgressBarComponent; + let componentRef: ComponentRef; let fixture: ComponentFixture; + let directive: ProgressBarDirective; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ProgressBarComponent ] - }) - .compileComponents(); - })); + imports: [ProgressBarComponent], + providers: [ProgressService] + }).compileComponents(); - beforeEach(() => { fixture = TestBed.createComponent(ProgressBarComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + directive = fixture.debugElement.injector.get(ProgressBarDirective); + componentRef.setInput('value', 42); + componentRef.setInput('color', 'success'); + componentRef.setInput('variant', 'striped'); + componentRef.setInput('animated', true); fixture.detectChanges(); - }); + })); it('should create', () => { - expect(component).toBeTruthy(); + expect(component).toBeDefined(); + }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('progress-bar'); + expect(fixture.nativeElement).toHaveClass('bg-success'); + expect(fixture.nativeElement).toHaveClass('progress-bar-striped'); + expect(fixture.nativeElement).toHaveClass('progress-bar-animated'); + }); + + it('should have style width %', () => { + expect(fixture.nativeElement.style.width).toBe('42%'); + }); + + it('should have aria-* attributes', () => { + expect(fixture.nativeElement.getAttribute('aria-valuenow')).toBe('42'); + expect(fixture.nativeElement.getAttribute('aria-valuemin')).toBe('0'); + expect(fixture.nativeElement.getAttribute('aria-valuemax')).toBe('100'); + expect(fixture.nativeElement.getAttribute('role')).toBe('progressbar'); + }); + + it('should not have aria-* attributes', () => { + componentRef.setInput('value', undefined); + fixture.detectChanges(); + expect(fixture.nativeElement.getAttribute('aria-valuenow')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('aria-valuemin')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('aria-valuemax')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('role')).toBeFalsy(); + // expect(fixture.nativeElement.style.width).toBeFalsy(); + expect(fixture.nativeElement.style.width).toBe('0%'); }); }); diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.component.ts b/projects/coreui-angular/src/lib/progress/progress-bar.component.ts index 7dbb0e2c..6d61a885 100644 --- a/projects/coreui-angular/src/lib/progress/progress-bar.component.ts +++ b/projects/coreui-angular/src/lib/progress/progress-bar.component.ts @@ -1,117 +1,29 @@ -import { Component, ElementRef, HostBinding, Input, OnChanges, OnInit, Renderer2, SimpleChanges } from '@angular/core'; -import { Colors } from '../coreui.types'; -import { BooleanInput, coerceBooleanProperty, coerceNumberProperty, NumberInput } from '@angular/cdk/coercion'; +import { Component, computed, inject } from '@angular/core'; +import { ProgressBarDirective } from './progress-bar.directive'; @Component({ selector: 'c-progress-bar', - template: '' + template: '', + hostDirectives: [ + { + directive: ProgressBarDirective, + inputs: ['animated', 'color', 'max', 'role', 'value', 'variant'] + } + ], + host: { class: 'progress-bar', '[class]': 'hostClasses()' } }) -export class ProgressBarComponent implements OnInit, OnChanges { +export class ProgressBarComponent { + readonly #progressBarDirective: ProgressBarDirective | null = inject(ProgressBarDirective, { optional: true }); - static ngAcceptInputType_animated: BooleanInput; - static ngAcceptInputType_value: NumberInput; - - /** - * Use to animate the stripes right to left via CSS3 animations. - * @type boolean - */ - @Input() - set animated(value: boolean) { - this._animated = coerceBooleanProperty(value); - - } - get animated() { - return this._animated; - } - private _animated = false; - - /** - * Sets the color context of the component to one of CoreUI’s themed colors. - * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light' - */ - @Input() color?: Colors; - // TODO: check if this is necessary. - @Input() precision = 0; - /** - * The percent to progress the ProgressBar. - */ - @Input() - set value(value: number) { - this._value = coerceNumberProperty(value); - }; - get value() { - return this._value; - } - private _value = 0; - /** - * Set the progress bar variant to optional striped. - * @values 'striped' - */ - @Input() variant?: 'striped'; - - /** - * Set default html role attribute. - * @type string - */ - @Input() - @HostBinding('attr.role') role = 'progressbar'; - private state = { - percent: 0, - min: 0, - max: 100 - }; - - constructor( - private renderer: Renderer2, - private hostElement: ElementRef - ) { } - - get min(): number { - return this.state.min; - } - - @Input() - set min(value: number) { - this.state.min = isNaN(value) ? 0 : value; - } - - get max(): number { - return this.state.max; - } - - @Input() - set max(value: number) { - this.state.max = isNaN(value) || value <= 0 || value === this.min ? 100 : value; - } - - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const animated = this.#progressBarDirective?.animated(); + const color = this.#progressBarDirective?.color(); + const variant = this.#progressBarDirective?.variant(); return { 'progress-bar': true, - 'progress-bar-animated': this.animated, - [`progress-bar-${this.variant}`]: !!this.variant, - [`bg-${this.color}`]: !!this.color - }; - } - - ngOnInit(): void { - this.setValues(); - } - - setPercent(): void { - this.state.percent = +((this.value / (this.max - this.min)) * 100).toFixed(this.precision); - } - - setValues(): void { - this.setPercent(); - const host: HTMLElement = this.hostElement.nativeElement; - this.renderer.setStyle(host, 'width', `${this.state.percent}%`); - this.renderer.setAttribute(host, 'aria-valuenow', String(this.value)); - this.renderer.setAttribute(host, 'aria-valuemin', String(this.min)); - this.renderer.setAttribute(host, 'aria-valuemax', String(this.max)); - } - - public ngOnChanges(changes: SimpleChanges): void { - this.setValues(); - } + 'progress-bar-animated': !!animated, + [`progress-bar-${variant}`]: !!variant, + [`bg-${color}`]: !!color + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.directive.spec.ts b/projects/coreui-angular/src/lib/progress/progress-bar.directive.spec.ts new file mode 100644 index 00000000..35b7967a --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-bar.directive.spec.ts @@ -0,0 +1,81 @@ +import { Component, ComponentRef, DebugElement, ElementRef, input, Renderer2 } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ProgressBarDirective } from './progress-bar.directive'; +import { By } from '@angular/platform-browser'; +import { ProgressService } from './progress.service'; + +class MockElementRef extends ElementRef {} + +@Component({ + template: `
      `, + selector: 'c-test', + imports: [ProgressBarDirective] +}) +export class TestComponent { + readonly value = input(42); + readonly color = input('success'); +} + +describe('ProgressBarDirective', () => { + let directive: ProgressBarDirective; + let debugElement: DebugElement; + let fixture: ComponentFixture; + let componentRef: ComponentRef; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [Renderer2, { provide: ElementRef, useClass: MockElementRef }, ProgressService], + imports: [TestComponent] + }); + fixture = TestBed.createComponent(TestComponent); + componentRef = fixture.componentRef; + debugElement = fixture.debugElement.query(By.directive(ProgressBarDirective)); + directive = debugElement.injector.get(ProgressBarDirective); + fixture.detectChanges(); + + // TestBed.runInInjectionContext(() => { + // directive = new ProgressBarDirective(); + // }); + }); + + it('should create an instance', () => { + expect(directive).toBeDefined(); + }); + + it('should have color value', () => { + expect(directive.color()).toBe('success'); + }); + + it('should have max value', () => { + expect(directive.max()).toBe(100); + }); + + it('should have variant value', () => { + expect(directive.variant()).toBe('striped'); + }); + + it('should have role value', () => { + expect(directive.role()).toBe('progressbar'); + }); + + it('should have precision value', () => { + expect(directive.precision()).toBe(0); + }); + + it('should have animated value', () => { + expect(directive.animated()).toBe(true); + }); + + it('should have aria-* attributes', () => { + expect(debugElement.nativeElement.getAttribute('aria-valuenow')).toBe('42'); + expect(debugElement.nativeElement.getAttribute('aria-valuemin')).toBe('0'); + expect(debugElement.nativeElement.getAttribute('aria-valuemax')).toBe('100'); + expect(debugElement.nativeElement.getAttribute('role')).toBe('progressbar'); + componentRef.setInput('value', undefined); + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('aria-valuenow')).toBeNull(); + expect(debugElement.nativeElement.getAttribute('aria-valuemin')).toBeNull(); + expect(debugElement.nativeElement.getAttribute('aria-valuemax')).toBeNull(); + expect(debugElement.nativeElement.getAttribute('role')).toBeNull(); + }); +}); diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.directive.ts b/projects/coreui-angular/src/lib/progress/progress-bar.directive.ts new file mode 100644 index 00000000..6e972d0e --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-bar.directive.ts @@ -0,0 +1,96 @@ +import { + booleanAttribute, + Directive, + effect, + EffectRef, + ElementRef, + inject, + input, + numberAttribute, + Renderer2 +} from '@angular/core'; +import { Colors } from '../coreui.types'; +import { ProgressService } from './progress.service'; + +@Directive({ + selector: '[cProgressBar]', + exportAs: 'cProgressBar' +}) +export class ProgressBarDirective { + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + readonly #progressService = inject(ProgressService); + + readonly #valuesEffect: EffectRef = effect(() => { + const host: HTMLElement = this.#hostElement.nativeElement; + const value = this.#progressService.value(); + const percent = this.#progressService.percent(); + const stacked = this.#progressService.stacked(); + if (value === undefined) { + for (const name of ['aria-valuenow', 'aria-valuemax', 'aria-valuemin', 'role']) { + this.#renderer.removeAttribute(host, name); + } + } else { + const { min, max } = this.#progressService; + this.#renderer.setAttribute(host, 'aria-valuenow', String(value)); + this.#renderer.setAttribute(host, 'aria-valuemin', String(min())); + this.#renderer.setAttribute(host, 'aria-valuemax', String(max())); + this.#renderer.setAttribute(host, 'role', this.role()); + } + const tagName = host.tagName; + if (percent >= 0 && ((stacked && tagName === 'C-PROGRESS') || (!stacked && tagName !== 'C-PROGRESS'))) { + this.#renderer.setStyle(host, 'width', `${percent}%`); + } else { + this.#renderer.removeStyle(host, 'width'); + } + }); + + /** + * Use to animate the stripes right to left via CSS3 animations. + * @return boolean + */ + readonly animated = input(undefined, { transform: booleanAttribute }); + + /** + * Sets the color context of the component to one of CoreUI’s themed colors. + * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light' + */ + readonly color = input(); + + readonly precision = input(0, { transform: numberAttribute }); + + /** + * The percent value the ProgressBar. + * @return number + * @default 0 + */ + readonly value = input(0, { transform: numberAttribute }); + + /** + * Set the progress bar variant to optional striped. + * @values 'striped' + * @default undefined + */ + readonly variant = input<'striped'>(); + + /** + * The max value of the ProgressBar. + * @return number + * @default 100 + */ + readonly max = input(100, { transform: numberAttribute }); + + /** + * Set default html role attribute. + * @return string + */ + readonly role = input('progressbar'); + + readonly #serviceEffect = effect(() => { + this.#progressService.precision.set(this.precision()); + const max = this.max(); + this.#progressService.max.set(isNaN(max) || max <= 0 ? 100 : max); + const value = this.value(); + this.#progressService.value.set(value && !isNaN(value) ? value : undefined); + }); +} diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.ts b/projects/coreui-angular/src/lib/progress/progress-bar.ts deleted file mode 100644 index d5416b29..00000000 --- a/projects/coreui-angular/src/lib/progress/progress-bar.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface IStackedBar { - value: number; - color?: string; - label?: string; - animated?: boolean; - striped?: boolean; - precision?: number; - min?: number; - max?: number; -} diff --git a/projects/coreui-angular/src/lib/progress/progress-stacked.component.spec.ts b/projects/coreui-angular/src/lib/progress/progress-stacked.component.spec.ts new file mode 100644 index 00000000..0c3508de --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-stacked.component.spec.ts @@ -0,0 +1,28 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProgressStackedComponent } from './progress-stacked.component'; + +describe('ProgressStackedComponent', () => { + let component: ProgressStackedComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProgressStackedComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ProgressStackedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeDefined(); + expect(component.stacked).toBeTruthy(); + }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('progress-stacked'); + }); +}); diff --git a/projects/coreui-angular/src/lib/progress/progress-stacked.component.ts b/projects/coreui-angular/src/lib/progress/progress-stacked.component.ts new file mode 100644 index 00000000..b5cd17af --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-stacked.component.ts @@ -0,0 +1,16 @@ +import { Component, input } from '@angular/core'; + +@Component({ + selector: 'c-progress-stacked', + exportAs: 'cProgressStacked', + template: '', + styles: ` + :host { + display: flex; + } + `, + host: { '[class.progress-stacked]': 'stacked()' } +}) +export class ProgressStackedComponent { + readonly stacked = input(true); +} diff --git a/projects/coreui-angular/src/lib/progress/progress.component.html b/projects/coreui-angular/src/lib/progress/progress.component.html new file mode 100644 index 00000000..f1f7d393 --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.component.html @@ -0,0 +1,13 @@ +@if (contentProgressBars()?.length) { + +} @else { + @let pbd = progressBarDirective; + + + +} + + + + + diff --git a/projects/coreui-angular/src/lib/progress/progress.component.scss b/projects/coreui-angular/src/lib/progress/progress.component.scss new file mode 100644 index 00000000..381bd487 --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.component.scss @@ -0,0 +1,5 @@ +:host-context(.progress-stacked) { + &.progress { + transition: var(--cui-progress-bar-transition) + } +} diff --git a/projects/coreui-angular/src/lib/progress/progress.component.spec.ts b/projects/coreui-angular/src/lib/progress/progress.component.spec.ts index 21cbcf35..24f9d3b9 100644 --- a/projects/coreui-angular/src/lib/progress/progress.component.spec.ts +++ b/projects/coreui-angular/src/lib/progress/progress.component.spec.ts @@ -1,25 +1,50 @@ +import { Component, DebugNode } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ProgressComponent } from './progress.component'; +import { ProgressBarDirective } from './progress-bar.directive'; + +@Component({ + template: ` `, + selector: 'c-test', + imports: [ProgressComponent] +}) +export class TestComponent {} describe('ProgressComponent', () => { - let component: ProgressComponent; - let fixture: ComponentFixture; + let component: TestComponent; + let progress: DebugNode | undefined; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ProgressComponent ] - }) - .compileComponents(); - })); + imports: [TestComponent, ProgressComponent, ProgressBarDirective] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); - beforeEach(() => { - fixture = TestBed.createComponent(ProgressComponent); component = fixture.componentInstance; + progress = fixture.debugElement.childNodes.find((v) => ProgressComponent); + // let x= fixture.debugElement.queryAll(By.directive(ProgressBarDirective)) fixture.detectChanges(); - }); + })); it('should create', () => { - expect(component).toBeTruthy(); + expect(component).toBeDefined(); + expect(progress).toBeDefined(); + }); + + it('should have css classes', () => { + expect(progress?.nativeNode).toHaveClass('progress'); + }); + + it('should have style width %', () => { + expect(progress?.nativeNode.style.width).toBe(''); + }); + + it('should have aria-* attributes', () => { + expect(progress?.nativeNode.getAttribute('aria-valuenow')).toBe('42'); + expect(progress?.nativeNode.getAttribute('aria-valuemin')).toBe('0'); + expect(progress?.nativeNode.getAttribute('aria-valuemax')).toBe('100'); }); }); diff --git a/projects/coreui-angular/src/lib/progress/progress.component.ts b/projects/coreui-angular/src/lib/progress/progress.component.ts index 47026ae2..b38324f6 100644 --- a/projects/coreui-angular/src/lib/progress/progress.component.ts +++ b/projects/coreui-angular/src/lib/progress/progress.component.ts @@ -1,66 +1,84 @@ -import { Component, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty, coerceNumberProperty, NumberInput } from '@angular/cdk/coercion'; +import { NgTemplateOutlet } from '@angular/common'; +import { + booleanAttribute, + Component, + computed, + contentChildren, + ElementRef, + inject, + input, + numberAttribute +} from '@angular/core'; +import { ProgressBarComponent } from './progress-bar.component'; +import { ProgressBarDirective } from './progress-bar.directive'; +import { ProgressStackedComponent } from './progress-stacked.component'; +import { ProgressService } from './progress.service'; @Component({ selector: 'c-progress', - template: '' + exportAs: 'cProgress', + templateUrl: './progress.component.html', + imports: [ProgressBarComponent, NgTemplateOutlet], + styleUrl: './progress.component.scss', + hostDirectives: [ + { + directive: ProgressBarDirective, + inputs: ['animated', 'color', 'max', 'role', 'value', 'variant'] + } + ], + host: { + class: 'progress', + '[class]': 'hostClasses()', + '[style.height]': 'hostStyle()' + }, + providers: [ProgressService] }) export class ProgressComponent { + readonly #hostElement = inject(ElementRef); + protected readonly progressBarDirective: ProgressBarDirective | null = inject(ProgressBarDirective, { + optional: true + }); + readonly #stacked: boolean = inject(ProgressStackedComponent, { optional: true })?.stacked() ?? false; + readonly #progressService = inject(ProgressService); - static ngAcceptInputType_height: NumberInput; - static ngAcceptInputType_thin: BooleanInput; - static ngAcceptInputType_white: BooleanInput; + constructor() { + this.#progressService.stacked.set(this.#stacked); + } + + readonly stacked = this.#progressService.stacked; + readonly percent = this.#progressService.percent; + readonly value = this.#progressService.value; + + readonly contentProgressBars = contentChildren(ProgressBarComponent); /** * Sets the height of the component. If you set that value the inner `` will automatically resize accordingly. - * @type number + * @return number */ - @Input() - set height(value: number) { - this._height = coerceNumberProperty(value); - } - get height() { - return this._height; - } - private _height: number = 0; + readonly height = input(0, { transform: numberAttribute }); /** * Displays thin progress. - * @type boolean + * @return boolean */ - @Input() - set thin(value: boolean) { - this._thin = coerceBooleanProperty(value); - } - get thin(): boolean { - return this._thin; - } - private _thin = false; + readonly thin = input(false, { transform: booleanAttribute }); /** * Change the default color to white. - * @type boolean + * @return boolean */ - @Input() - get white(): boolean { - return this._white; - } - set white(value: boolean) { - this._white = coerceBooleanProperty(value); - } - private _white = false; + readonly white = input(false, { transform: booleanAttribute }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { progress: true, - 'progress-thin': this.thin, - 'progress-white': this.white - }; - } + 'progress-thin': this.thin(), + 'progress-white': this.white() + } as Record; + }); - @HostBinding('style.height') - get hostStyle(): any { - return !!this.height ? `${this.height}px` : ''; - } + readonly hostStyle = computed(() => { + const height = this.height(); + return !!height ? `${height}px` : (this.#hostElement?.nativeElement?.style?.height ?? undefined); + }); } diff --git a/projects/coreui-angular/src/lib/progress/progress.module.ts b/projects/coreui-angular/src/lib/progress/progress.module.ts index e26fa2bc..5f91781f 100644 --- a/projects/coreui-angular/src/lib/progress/progress.module.ts +++ b/projects/coreui-angular/src/lib/progress/progress.module.ts @@ -1,16 +1,21 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { ProgressComponent } from './progress.component'; import { ProgressBarComponent } from './progress-bar.component'; +import { ProgressBarDirective } from './progress-bar.directive'; +import { ProgressStackedComponent } from './progress-stacked.component'; @NgModule({ - declarations: [ProgressComponent, ProgressBarComponent], exports: [ ProgressComponent, - ProgressBarComponent + ProgressBarComponent, + ProgressBarDirective, + ProgressStackedComponent ], imports: [ - CommonModule + ProgressComponent, + ProgressBarComponent, + ProgressBarDirective, + ProgressStackedComponent ] }) -export class ProgressModule { } +export class ProgressModule {} diff --git a/projects/coreui-angular/src/lib/progress/progress.service.spec.ts b/projects/coreui-angular/src/lib/progress/progress.service.spec.ts new file mode 100644 index 00000000..fe751942 --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.service.spec.ts @@ -0,0 +1,32 @@ +import { TestBed } from '@angular/core/testing'; + +import { ProgressService } from './progress.service'; + +describe('ProgressService', () => { + let service: ProgressService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ProgressService] + }); + service = TestBed.inject(ProgressService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should expose values', () => { + service.value.set(42); + expect(service.percent()).toBe(42); + expect(service.min()).toBe(0); + expect(service.max()).toBe(100); + expect(service.value()).toBe(42); + service.max.set(200); + expect(service.max()).toBe(200); + service.value.set(84); + expect(service.percent()).toBe(42); + service.value.set(undefined); + expect(service.percent()).toBe(0); + }); +}); diff --git a/projects/coreui-angular/src/lib/progress/progress.service.ts b/projects/coreui-angular/src/lib/progress/progress.service.ts new file mode 100644 index 00000000..1a43dac0 --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.service.ts @@ -0,0 +1,14 @@ +import { computed, Injectable, signal } from '@angular/core'; + +@Injectable() +export class ProgressService { + readonly stacked = signal(false); + readonly value = signal(undefined); + readonly precision = signal(0); + readonly min = signal(0); + readonly max = signal(100); + + readonly percent = computed(() => { + return +((((this.value() ?? 0) - this.min()) / (this.max() - this.min())) * 100).toFixed(this.precision()); + }); +} diff --git a/projects/coreui-angular/src/lib/progress/progress.type.ts b/projects/coreui-angular/src/lib/progress/progress.type.ts new file mode 100644 index 00000000..7fe7e28b --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.type.ts @@ -0,0 +1,21 @@ +import { Colors } from '../coreui.types'; + +export interface IProgress { + height: number; + thin: boolean; + white: boolean; +} + +export interface IProgressBar extends IProgressBarStacked { + animated?: boolean; + color?: Colors; + max?: number; + precision: number; + value?: number; + variant?: 'striped'; + width?: number; +} + +export interface IProgressBarStacked { + stacked?: boolean; +} diff --git a/projects/coreui-angular/src/lib/progress/public_api.ts b/projects/coreui-angular/src/lib/progress/public_api.ts index 6c97b9ed..51639ddc 100644 --- a/projects/coreui-angular/src/lib/progress/public_api.ts +++ b/projects/coreui-angular/src/lib/progress/public_api.ts @@ -1,4 +1,6 @@ -export { IStackedBar } from './progress-bar'; +export type { IProgress, IProgressBar, IProgressBarStacked } from './progress.type'; export { ProgressComponent } from './progress.component'; +export { ProgressStackedComponent } from './progress-stacked.component'; export { ProgressBarComponent } from './progress-bar.component'; +export { ProgressBarDirective } from './progress-bar.directive'; export { ProgressModule } from './progress.module'; diff --git a/projects/coreui-angular/src/lib/services/class-toggle.service.ts b/projects/coreui-angular/src/lib/services/class-toggle.service.ts index d870d2f9..9fe206a1 100644 --- a/projects/coreui-angular/src/lib/services/class-toggle.service.ts +++ b/projects/coreui-angular/src/lib/services/class-toggle.service.ts @@ -1,26 +1,25 @@ -import { Inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core'; +import { inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core'; import { DOCUMENT } from '@angular/common'; @Injectable({ providedIn: 'root' }) export class ClassToggleService { + readonly #document = inject(DOCUMENT); + readonly #rendererFactory = inject(RendererFactory2); - private renderer: Renderer2; + #renderer: Renderer2; - constructor( - @Inject(DOCUMENT) private document: any, - private rendererFactory: RendererFactory2 - ) { - this.renderer = rendererFactory.createRenderer(null, null); + constructor() { + this.#renderer = this.#rendererFactory.createRenderer(null, null); } toggle(selector: any, className: string) { - const element = document.querySelector(selector); + const element = this.#document.querySelector(selector); if (element) { - element.classList.contains(className) ? - this.renderer.removeClass(element, className) : - this.renderer.addClass(element, className); + element.classList.contains(className) + ? this.#renderer.removeClass(element, className) + : this.#renderer.addClass(element, className); } } } diff --git a/projects/coreui-angular/src/lib/services/color-mode.service.spec.ts b/projects/coreui-angular/src/lib/services/color-mode.service.spec.ts new file mode 100644 index 00000000..6118fee6 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/color-mode.service.spec.ts @@ -0,0 +1,25 @@ +import { TestBed } from '@angular/core/testing'; +import { ColorModeService } from './color-mode.service'; + +describe('ColorModeService', () => { + + let service: ColorModeService; + + beforeEach(() => { + service = TestBed.inject(ColorModeService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should switch themes', () => { + expect(service.colorMode()).toBeUndefined(); + service.colorMode.set('light'); + expect(service.colorMode()).toBe('light'); + service.colorMode.set('dark'); + expect(service.colorMode()).toBe('dark'); + service.colorMode.set('auto'); + expect(service.colorMode()).toBe('auto'); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/color-mode.service.ts b/projects/coreui-angular/src/lib/services/color-mode.service.ts new file mode 100644 index 00000000..a3148a95 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/color-mode.service.ts @@ -0,0 +1,87 @@ +import { DOCUMENT } from '@angular/common'; +import { afterNextRender, DestroyRef, effect, inject, Injectable, signal, WritableSignal } from '@angular/core'; +import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'; +import { tap } from 'rxjs/operators'; +import { LocalStorageService } from './local-storage.service'; + +export type ColorMode = 'light' | 'dark' | 'auto' | string | undefined; + +@Injectable({ + providedIn: 'root' +}) +export class ColorModeService { + readonly #destroyRef: DestroyRef = inject(DestroyRef); + readonly #document: Document = inject(DOCUMENT); + readonly #localStorage: LocalStorageService = inject(LocalStorageService); + + readonly eventName = signal('ColorSchemeChange'); + readonly localStorageItemName: WritableSignal = signal(undefined); + readonly localStorageItemName$ = toObservable(this.localStorageItemName); + readonly colorMode: WritableSignal = signal(undefined); + + readonly #colorModeEffect = effect(() => { + const colorMode = this.colorMode(); + if (colorMode) { + const localStorageItemName = this.localStorageItemName(); + localStorageItemName && this.setStoredTheme(localStorageItemName, colorMode); + this.#setTheme(colorMode); + } + }); + + constructor() { + afterNextRender({ + read: () => { + this.localStorageItemName$ + .pipe( + tap((params) => { + this.colorMode.set(this.getDefaultScheme(params)); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(); + } + }); + } + + getStoredTheme(localStorageItemName: string) { + return this.#localStorage.getItem(localStorageItemName); + } + + setStoredTheme(localStorageItemName: string, colorMode: string) { + return this.#localStorage.setItem(localStorageItemName, colorMode); + } + + removeStoredTheme(localStorageItemName: string) { + this.#localStorage.removeItem(localStorageItemName); + } + + getDefaultScheme(localStorageItemName: string | undefined) { + if (this.#document.defaultView === undefined) { + return this.getDatasetTheme(); + } + + const storedTheme = localStorageItemName && this.getStoredTheme(localStorageItemName); + + return storedTheme ?? this.getDatasetTheme(); + } + + getPrefersColorScheme() { + return this.#document.defaultView?.matchMedia('(prefers-color-scheme: dark)').matches + ? 'dark' + : this.#document.defaultView?.matchMedia('(prefers-color-scheme: light)').matches + ? 'light' + : undefined; + } + + getDatasetTheme(): ColorMode { + return this.#document.documentElement.dataset['coreuiTheme']; + } + + #setTheme(colorMode: ColorMode) { + this.#document.documentElement.dataset['coreuiTheme'] = + colorMode === 'auto' ? this.getPrefersColorScheme() : colorMode; + + const event = new Event(this.eventName()); + this.#document.documentElement.dispatchEvent(event); + } +} diff --git a/projects/coreui-angular/src/lib/services/in-memory-storage.service.spec.ts b/projects/coreui-angular/src/lib/services/in-memory-storage.service.spec.ts new file mode 100644 index 00000000..dd5ce72b --- /dev/null +++ b/projects/coreui-angular/src/lib/services/in-memory-storage.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { InMemoryStorageService } from './in-memory-storage.service'; + +describe('InMemoryStorageService', () => { + let service: InMemoryStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(InMemoryStorageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/in-memory-storage.service.ts b/projects/coreui-angular/src/lib/services/in-memory-storage.service.ts new file mode 100644 index 00000000..2d060d3f --- /dev/null +++ b/projects/coreui-angular/src/lib/services/in-memory-storage.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class InMemoryStorageService implements Storage { + #storage = new Map(); + + public setItem(key: string, data: any): void { + this.#storage.set(key, JSON.stringify(data)); + } + + public getItem(key: string): any { + return this.#storage.has(key) ? JSON.parse(this.#storage.get(key) ?? 'null') : undefined; + } + + public removeItem(key: string): void { + this.#storage.delete(key); + } + + public clear() { + this.#storage.clear(); + } + + public get length() { + return this.#storage.size; + } + + public key(index: number) { + return Array.from(this.#storage.keys())[index]; + } +} diff --git a/projects/coreui-angular/src/lib/services/intersection.service.spec.ts b/projects/coreui-angular/src/lib/services/intersection.service.spec.ts index b56af721..9954988e 100644 --- a/projects/coreui-angular/src/lib/services/intersection.service.spec.ts +++ b/projects/coreui-angular/src/lib/services/intersection.service.spec.ts @@ -7,10 +7,9 @@ describe('IntersectionService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [IntersectionService] + providers: [IntersectionService] }); - service = new IntersectionService(); - // service = TestBed.inject(IntersectionService); + service = TestBed.inject(IntersectionService); }); it('should be created', () => { diff --git a/projects/coreui-angular/src/lib/services/intersection.service.ts b/projects/coreui-angular/src/lib/services/intersection.service.ts index 67508e28..72d9dfc7 100644 --- a/projects/coreui-angular/src/lib/services/intersection.service.ts +++ b/projects/coreui-angular/src/lib/services/intersection.service.ts @@ -1,22 +1,22 @@ -import { Injectable, OnDestroy } from '@angular/core'; +import { isPlatformServer } from '@angular/common'; +import { ElementRef, inject, Injectable, OnDestroy, PLATFORM_ID } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; -interface IIntersectionObserverInit { +export interface IIntersectionObserverInit { root?: Element | null; rootMargin?: string; threshold?: number | number[]; } -@Injectable() +@Injectable({ + providedIn: 'root' +}) export class IntersectionService implements OnDestroy { - constructor() { } + platformId = inject(PLATFORM_ID); - private intersecting = new BehaviorSubject(false); - intersecting$ = this.intersecting.asObservable(); - - private intersectionObserver!: IntersectionObserver; - private hostElement!: { nativeElement: Element; }; + readonly #intersecting: BehaviorSubject = new BehaviorSubject({ isIntersecting: false }); + readonly intersecting$ = this.#intersecting.asObservable(); private defaultObserverOptions: IIntersectionObserverInit = { root: null, @@ -24,23 +24,36 @@ export class IntersectionService implements OnDestroy { threshold: 0.2 }; - createIntersectionObserver(hostElement: { nativeElement: Element; }, observerOptions = this.defaultObserverOptions) { + hostElementRefs: Map = new Map(); + + createIntersectionObserver(hostElement: ElementRef, observerOptions = this.defaultObserverOptions) { - const options = { ...this.defaultObserverOptions, ...observerOptions } + if (isPlatformServer(this.platformId)) { + this.#intersecting.next({ isIntersecting: true, hostElement }); + return; + } - this.hostElement = hostElement; + const options: IIntersectionObserverInit = { ...this.defaultObserverOptions, ...observerOptions }; - const handleIntersect = (entries: any[], observer: any) => { + const handleIntersect = (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => { entries.forEach((entry: any) => { - this.intersecting.next(entry.isIntersecting); + this.#intersecting.next({ isIntersecting: entry.isIntersecting, hostElement }); }); }; - this.intersectionObserver = new IntersectionObserver(handleIntersect, options); - this.intersectionObserver.observe(hostElement.nativeElement); + this.hostElementRefs.set(hostElement, new IntersectionObserver(handleIntersect, options)); + this.hostElementRefs.get(hostElement)?.observe(hostElement.nativeElement); + } + + unobserve(elementRef: ElementRef) { + this.hostElementRefs.get(elementRef)?.unobserve(elementRef.nativeElement); + this.hostElementRefs.set(elementRef, null); + this.hostElementRefs.delete(elementRef); } ngOnDestroy(): void { - this.intersectionObserver?.unobserve(this.hostElement?.nativeElement); + this.hostElementRefs.forEach((observer, elementRef) => { + observer?.unobserve(elementRef.nativeElement); + }); } } diff --git a/projects/coreui-angular/src/lib/services/listeners.service.spec.ts b/projects/coreui-angular/src/lib/services/listeners.service.spec.ts index 097e5d05..653c7b62 100644 --- a/projects/coreui-angular/src/lib/services/listeners.service.spec.ts +++ b/projects/coreui-angular/src/lib/services/listeners.service.spec.ts @@ -1,22 +1,18 @@ -import { Renderer2 } from '@angular/core'; import { TestBed } from '@angular/core/testing'; - +import { Renderer2 } from '@angular/core'; import { ListenersService } from './listeners.service'; describe('ListenersService', () => { - let renderer: Renderer2; - let service: ListenersService; - beforeEach(() => { TestBed.configureTestingModule({ - imports: [Renderer2, ListenersService], - providers: [Renderer2] + providers: [Renderer2], }); - service = new ListenersService(renderer); - // service = TestBed.inject(ListenersService); }); it('should be created', () => { - expect(service).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const service = new ListenersService(); + expect(service).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/services/listeners.service.ts b/projects/coreui-angular/src/lib/services/listeners.service.ts index 6195aed7..abb95d06 100644 --- a/projects/coreui-angular/src/lib/services/listeners.service.ts +++ b/projects/coreui-angular/src/lib/services/listeners.service.ts @@ -1,62 +1,59 @@ -import { ElementRef, Injectable, Renderer2 } from '@angular/core'; +import { ElementRef, inject, Injectable, Renderer2 } from '@angular/core'; import { Triggers } from '../coreui.types'; export interface IListenersConfig { - hostElement: ElementRef, - trigger?: Triggers | Triggers[], - callbackOn?: () => void, - callbackOff?: () => void, - callbackToggle?: () => void, + hostElement: ElementRef; + trigger?: Triggers | Triggers[]; + callbackOn?: () => void; + callbackOff?: () => void; + callbackToggle?: () => void; } @Injectable() export class ListenersService { + readonly renderer = inject(Renderer2); private listeners: Map void> = new Map(); - constructor( - private renderer: Renderer2 - ) {} - - setListeners({hostElement, trigger, callbackOn, callbackOff, callbackToggle}: IListenersConfig): void { + setListeners({ + hostElement, + trigger, + callbackOn, + callbackOff, + callbackToggle, + }: IListenersConfig): void { const host = hostElement.nativeElement; - const triggers = Array.isArray(trigger) - ? trigger - : trigger?.split(' ') ?? []; + const triggers = Array.isArray(trigger) ? trigger : trigger?.split(' ') ?? []; if (triggers?.includes('click')) { - typeof callbackToggle === 'function' && this.listeners.set( - 'click', - this.renderer.listen(host, 'click', callbackToggle) - ); + typeof callbackToggle === 'function' && + this.listeners.set('click', this.renderer.listen(host, 'click', callbackToggle)); } if (triggers?.includes('focus')) { - typeof callbackOn === 'function' && this.listeners.set( - 'focus', - this.renderer.listen(host, 'focus', callbackOn) - ); + typeof callbackOn === 'function' && + this.listeners.set('focus', this.renderer.listen(host, 'focus', callbackOn)); + } + if (triggers?.includes('focusin')) { + typeof callbackOff === 'function' && + this.listeners.set('focusout', this.renderer.listen(host, 'focusout', callbackOff)); + typeof callbackOn === 'function' && + this.listeners.set('focusin', this.renderer.listen(host, 'focusin', callbackOn)); } if (triggers?.includes('click') || triggers?.includes('focus')) { - typeof callbackOff === 'function' && this.listeners.set( - 'blur', - this.renderer.listen(host, 'blur', callbackOff) - ); + typeof callbackOff === 'function' && + this.listeners.set('blur', this.renderer.listen(host, 'blur', callbackOff)); } if (triggers?.includes('hover')) { - typeof callbackOn === 'function' && this.listeners.set( - 'mouseenter', - this.renderer.listen(host, 'mouseenter', callbackOn), - ); - typeof callbackOff === 'function' && this.listeners.set( - 'mouseleave', - this.renderer.listen(host, 'mouseleave', callbackOff) - ); + typeof callbackOn === 'function' && + this.listeners.set('mouseenter', this.renderer.listen(host, 'mouseenter', callbackOn)); + typeof callbackOff === 'function' && + this.listeners.set('mouseleave', this.renderer.listen(host, 'mouseleave', callbackOff)); } } clearListeners(): void { this.listeners.forEach((unListen, key) => { - unListen(); + unListen(); }); this.listeners.forEach((unListen, key) => { // @ts-ignore diff --git a/projects/coreui-angular/src/lib/services/local-storage.service.spec.ts b/projects/coreui-angular/src/lib/services/local-storage.service.spec.ts new file mode 100644 index 00000000..ba1dbd43 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/local-storage.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { LocalStorageService } from './local-storage.service'; + +describe('LocalStorageService', () => { + let service: LocalStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(LocalStorageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/local-storage.service.ts b/projects/coreui-angular/src/lib/services/local-storage.service.ts new file mode 100644 index 00000000..a29ef3c3 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/local-storage.service.ts @@ -0,0 +1,44 @@ +import { DOCUMENT, isPlatformBrowser } from '@angular/common'; +import { inject, Injectable, PLATFORM_ID } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { InMemoryStorageService } from './in-memory-storage.service'; + +@Injectable({ + providedIn: 'root' +}) +export class LocalStorageService { + private platformId = inject(PLATFORM_ID); + private document = inject(DOCUMENT); + + constructor() { + this.#localStorage = + isPlatformBrowser(this.platformId) && this.document.defaultView + ? this.document.defaultView?.localStorage + : new InMemoryStorageService(); + } + + #localStorage: Storage; + readonly #data$ = new BehaviorSubject<{ key: string; data: any } | null>(null); + public readonly data$ = this.#data$.asObservable(); + + public setItem(key: string, data: any): void { + this.#localStorage.setItem(key, JSON.stringify(data)); + this.#data$.next({ key, data }); + } + + public getItem(key: string): any { + const data = JSON.parse(this.#localStorage.getItem(key) || 'null'); + this.#data$.next({ key, data }); + return data; + } + + public removeItem(key: string): void { + this.#localStorage.removeItem(key); + this.#data$.next({ key, data: null }); + } + + public clear() { + this.#localStorage.clear(); + this.#data$.next(null); + } +} diff --git a/projects/coreui-angular/src/lib/services/public_api.ts b/projects/coreui-angular/src/lib/services/public_api.ts index c6a21265..3d3a0ac3 100644 --- a/projects/coreui-angular/src/lib/services/public_api.ts +++ b/projects/coreui-angular/src/lib/services/public_api.ts @@ -1,2 +1,8 @@ -export { IntersectionService } from './intersection.service'; +export { IntersectionService, type IIntersectionObserverInit } from './intersection.service'; +export { ListenersService, type IListenersConfig } from './listeners.service'; export { ClassToggleService } from './class-toggle.service'; +export { LocalStorageService } from './local-storage.service'; +export { InMemoryStorageService } from './in-memory-storage.service'; +export { ColorModeService, type ColorMode } from './color-mode.service'; +export { UIDService } from './uid.service'; +export { RtlService } from './rtl.service'; diff --git a/projects/coreui-angular/src/lib/services/rtl.service.spec.ts b/projects/coreui-angular/src/lib/services/rtl.service.spec.ts new file mode 100644 index 00000000..1274c3ea --- /dev/null +++ b/projects/coreui-angular/src/lib/services/rtl.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { RtlService } from './rtl.service'; + +describe('RtlService', () => { + let service: RtlService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(RtlService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/rtl.service.ts b/projects/coreui-angular/src/lib/services/rtl.service.ts new file mode 100644 index 00000000..2752333f --- /dev/null +++ b/projects/coreui-angular/src/lib/services/rtl.service.ts @@ -0,0 +1,17 @@ +import { inject, Injectable } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +@Injectable({ + providedIn: 'root' +}) +export class RtlService { + readonly #document = inject(DOCUMENT); + + isRTL(element?: HTMLElement | null): boolean { + if (element) { + return element.closest('[dir="rtl"]') !== null; + } + + return this.#document?.documentElement?.dir === 'rtl' || this.#document?.body?.dir === 'rtl'; + } +} diff --git a/projects/coreui-angular/src/lib/services/script-injector.service.spec.ts b/projects/coreui-angular/src/lib/services/script-injector.service.spec.ts new file mode 100644 index 00000000..9d02052a --- /dev/null +++ b/projects/coreui-angular/src/lib/services/script-injector.service.spec.ts @@ -0,0 +1,19 @@ +import { TestBed } from '@angular/core/testing'; +import { Renderer2 } from '@angular/core'; + +import { ScriptInjectorService } from './script-injector.service'; + +describe('ScriptInjectorService', () => { + let service: ScriptInjectorService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [Renderer2] + }); + service = TestBed.inject(ScriptInjectorService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/script-injector.service.ts b/projects/coreui-angular/src/lib/services/script-injector.service.ts new file mode 100644 index 00000000..e200fdfe --- /dev/null +++ b/projects/coreui-angular/src/lib/services/script-injector.service.ts @@ -0,0 +1,66 @@ +import { DOCUMENT } from '@angular/common'; +import { inject, Injectable, Renderer2 } from '@angular/core'; + +export type ReferrerPolicy = + | '' + | 'no-referrer' + | 'no-referrer-when-downgrade' + | 'origin' + | 'origin-when-cross-origin' + | 'same-origin' + | 'strict-origin' + | 'strict-origin-when-cross-origin' + | 'unsafe-url'; + +export interface IScriptAttributes { + async?: boolean; + blocking?: 'render'; + crossorigin?: 'anonymous' | 'use-credentials'; + defer?: boolean; + fetchpriority?: 'auto' | 'high' | 'low'; + importmap?: string; + integrity?: string; + nomodule?: boolean; + nonce?: string; + referrerpolicy?: ReferrerPolicy; + src: string; + type?: string; +} + +export interface IScriptConfig { + attributes?: IScriptAttributes; + loaded?: boolean; + elementName?: string; +} + +@Injectable({ + providedIn: 'root' +}) +export class ScriptInjectorService { + document: Document = inject(DOCUMENT); + renderer: Renderer2 = inject(Renderer2); + + #scriptStore = new Map(); + + public injectScript(src: string, scriptConfig: IScriptConfig = { elementName: 'head' }) { + if (this.#scriptStore.has(src) && this.#scriptStore.get(src)?.loaded) { + return; + } + const scriptAttributes: IScriptAttributes = { ...scriptConfig?.attributes, src }; + this.loadScript(src, (scriptConfig = { ...scriptConfig, attributes: scriptAttributes })).then(); + } + + loadScript(src: string, scriptConfig: IScriptConfig) { + return new Promise((resolve, reject) => { + const scriptElement = this.renderer.createElement('script'); + this.renderer.setAttribute(scriptElement, 'type', 'text/javascript'); + this.renderer.setAttribute(scriptElement, 'src', src); + scriptElement.onload = () => { + this.#scriptStore.set(src, { ...scriptConfig, loaded: true }); + resolve({ src: src, loaded: true }); + }; + scriptElement.onerror = (error: any) => reject({ src: src, loaded: false, error }); + this.renderer.appendChild(this.document.querySelector(scriptConfig.elementName ?? 'head'), scriptElement); + }); + } +} diff --git a/projects/coreui-angular/src/lib/services/uid.service.spec.ts b/projects/coreui-angular/src/lib/services/uid.service.spec.ts new file mode 100644 index 00000000..8ea8d4dc --- /dev/null +++ b/projects/coreui-angular/src/lib/services/uid.service.spec.ts @@ -0,0 +1,22 @@ +import { TestBed } from '@angular/core/testing'; + +import { UIDService } from './uid.service'; + +describe('UIDService', () => { + let service: UIDService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UIDService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should return an UID string', () => { + expect(typeof service.getUID('test')).toBe('string'); + expect(service.getUID('test')).toContain('test-'); + expect(service.getUID()).toContain('random-id-'); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/uid.service.ts b/projects/coreui-angular/src/lib/services/uid.service.ts new file mode 100644 index 00000000..16003de7 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/uid.service.ts @@ -0,0 +1,18 @@ +import { inject, Injectable } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +@Injectable({ + providedIn: 'root' +}) +export class UIDService { + readonly #document = inject(DOCUMENT); + + getUID(prefix: string = 'random-id'): string { + let uid = prefix; + do { + uid = `${prefix}-${Math.floor(Math.random() * 1000000).toString(10)}`; + } while (this.#document.getElementById(uid)); + + return uid; + } +} diff --git a/projects/coreui-angular/src/lib/shared/element-ref.directive.spec.ts b/projects/coreui-angular/src/lib/shared/element-ref.directive.spec.ts new file mode 100644 index 00000000..2360e527 --- /dev/null +++ b/projects/coreui-angular/src/lib/shared/element-ref.directive.spec.ts @@ -0,0 +1,26 @@ +import { ElementRefDirective } from './element-ref.directive'; +import { ElementRef } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; + +class MockElementRef extends ElementRef {} + +describe('ElementRefDirective', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [{ provide: ElementRef, useClass: MockElementRef }] + }); + }); + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new ElementRefDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should expose elementRef', () => { + TestBed.runInInjectionContext(() => { + const directive = new ElementRefDirective(); + expect(directive.elementRef).toBeInstanceOf(ElementRef); + }); + }); +}); diff --git a/projects/coreui-angular/src/lib/shared/element-ref.directive.ts b/projects/coreui-angular/src/lib/shared/element-ref.directive.ts new file mode 100644 index 00000000..c1fcee32 --- /dev/null +++ b/projects/coreui-angular/src/lib/shared/element-ref.directive.ts @@ -0,0 +1,9 @@ +import { Directive, ElementRef, inject } from '@angular/core'; + +@Directive({ + selector: '[cElementRef]', + exportAs: 'cElementRef' +}) +export class ElementRefDirective { + public readonly elementRef = inject(ElementRef); +} diff --git a/projects/coreui-angular/src/lib/shared/html-attr.directive.spec.ts b/projects/coreui-angular/src/lib/shared/html-attr.directive.spec.ts index f58b7daa..5ba9ca78 100644 --- a/projects/coreui-angular/src/lib/shared/html-attr.directive.spec.ts +++ b/projects/coreui-angular/src/lib/shared/html-attr.directive.spec.ts @@ -1,51 +1,50 @@ -import { Component, DebugElement, Renderer2, Type } from '@angular/core'; +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { HtmlAttributesDirective } from './html-attr.directive'; @Component({ - template: `
      ` + template: `
      `, + imports: [HtmlAttributesDirective] }) class TestComponent {} -describe('HtmlAttributesDirective', () => { +class MockElementRef extends ElementRef {} - let component: TestComponent; +describe('HtmlAttributesDirective', () => { let fixture: ComponentFixture; - let inputEl: DebugElement; - let renderer: Renderer2; + let debugElement: DebugElement; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [TestComponent, HtmlAttributesDirective] + imports: [HtmlAttributesDirective, TestComponent], + providers: [Renderer2, { provide: ElementRef, useClass: MockElementRef }] }); fixture = TestBed.createComponent(TestComponent); - component = fixture.componentInstance; - inputEl = fixture.debugElement.query(By.css('div')); - renderer = fixture.componentRef.injector.get(Renderer2 as Type); + debugElement = fixture.debugElement.query(By.css('div')); }); it('should create an instance', () => { - const directive = new HtmlAttributesDirective(renderer, inputEl); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new HtmlAttributesDirective(); + expect(directive).toBeTruthy(); + }); }); it('should render a class attr', () => { fixture.detectChanges(); - // console.log(inputEl.nativeElement.classList); - expect(inputEl.nativeElement.classList.contains('test')).toBeTruthy(); + expect(debugElement.nativeElement).toHaveClass('test'); }); it('should render a style attr', () => { fixture.detectChanges(); // console.log(inputEl.nativeElement.style.backgroundColor); - expect(inputEl.nativeElement.style.backgroundColor).toBe('red'); + expect(debugElement.nativeElement.style.backgroundColor).toBe('red'); }); it('should render an id attr', () => { fixture.detectChanges(); - // console.log(inputEl.nativeElement.attributes); - expect(inputEl.nativeElement.getAttribute('id')).toBe('id-1'); + expect(debugElement.nativeElement.getAttribute('id')).toBe('id-1'); }); }); diff --git a/projects/coreui-angular/src/lib/shared/html-attr.directive.ts b/projects/coreui-angular/src/lib/shared/html-attr.directive.ts index 8ffaa88f..28141a9f 100644 --- a/projects/coreui-angular/src/lib/shared/html-attr.directive.ts +++ b/projects/coreui-angular/src/lib/shared/html-attr.directive.ts @@ -1,23 +1,19 @@ -import {Directive, ElementRef, Input, OnInit, Renderer2} from '@angular/core'; +import { Directive, effect, ElementRef, inject, input, Renderer2 } from '@angular/core'; @Directive({ selector: '[cHtmlAttr]', exportAs: 'cHtmlAttr' }) -export class HtmlAttributesDirective implements OnInit { +export class HtmlAttributesDirective { + readonly cHtmlAttr = input>(); - // @ts-ignore - @Input() cHtmlAttr: {[key: string]: any }; + readonly #renderer = inject(Renderer2); + readonly #elementRef = inject(ElementRef); - constructor( - private renderer: Renderer2, - private el: ElementRef - ) {} - - ngOnInit(): void { - const attribs = this.cHtmlAttr; + readonly #attrEffect = effect(() => { + const attribs = this.cHtmlAttr(); for (const attr in attribs) { - if (attr === 'style' && typeof(attribs[attr]) === 'object' ) { + if (attr === 'style' && typeof attribs[attr] === 'object') { this.setStyle(attribs[attr]); } else if (attr === 'class') { this.addClass(attribs[attr]); @@ -25,26 +21,28 @@ export class HtmlAttributesDirective implements OnInit { this.setAttrib(attr, attribs[attr]); } } - } + }); - private setStyle(styles: { [x: string]: any; }): void { + private setStyle(styles: Record): void { for (const style in styles) { if (style) { - this.renderer.setStyle(this.el.nativeElement, style, styles[style]); + this.#renderer.setStyle(this.#elementRef.nativeElement, style, styles[style]); } } } - private addClass(classes: string): void { - const classArray = (Array.isArray(classes) ? classes : classes.split(' ')); - classArray.filter((element) => element.length > 0).forEach(element => { - this.renderer.addClass(this.el.nativeElement, element ); - }); + private addClass(classes: string | string[]): void { + const classArray = Array.isArray(classes) ? classes : classes.split(' '); + classArray + .filter((element) => element.length > 0) + .forEach((element) => { + this.#renderer.addClass(this.#elementRef.nativeElement, element); + }); } private setAttrib(key: string, value: string | null): void { - value !== null ? - this.renderer.setAttribute(this.el.nativeElement, key, value ) : - this.renderer.removeAttribute(this.el.nativeElement, key); + value !== null + ? this.#renderer.setAttribute(this.#elementRef.nativeElement, key, value) + : this.#renderer.removeAttribute(this.#elementRef.nativeElement, key); } } diff --git a/projects/coreui-angular/src/lib/shared/public_api.ts b/projects/coreui-angular/src/lib/shared/public_api.ts index a2450d0e..9fe03e59 100644 --- a/projects/coreui-angular/src/lib/shared/public_api.ts +++ b/projects/coreui-angular/src/lib/shared/public_api.ts @@ -1,3 +1,5 @@ -export { SharedModule } from './shared.module'; +export { ElementRefDirective } from './element-ref.directive'; export { HtmlAttributesDirective } from './html-attr.directive'; export { TemplateIdDirective } from './template-id.directive'; +export { ThemeDirective } from './theme.directive'; +export { SharedModule } from './shared.module'; diff --git a/projects/coreui-angular/src/lib/shared/shared.module.ts b/projects/coreui-angular/src/lib/shared/shared.module.ts index 79e2aa62..cb545ddf 100644 --- a/projects/coreui-angular/src/lib/shared/shared.module.ts +++ b/projects/coreui-angular/src/lib/shared/shared.module.ts @@ -1,35 +1,18 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -// import { OutClickService } from './out-click.service'; -// import { OutClickDirective } from './out-click.directive'; +import { ElementRefDirective } from './element-ref.directive'; import { HtmlAttributesDirective } from './html-attr.directive'; import { TemplateIdDirective } from './template-id.directive'; +import { ThemeDirective } from './theme.directive'; @NgModule({ - imports: [ - CommonModule - ], - declarations: [ - // OutClickDirective, - HtmlAttributesDirective, - TemplateIdDirective - ], - exports: [ - // OutClickDirective, - HtmlAttributesDirective, - TemplateIdDirective - ], - providers: [] + imports: [ElementRefDirective, HtmlAttributesDirective, TemplateIdDirective, ThemeDirective], + exports: [ElementRefDirective, HtmlAttributesDirective, TemplateIdDirective, ThemeDirective], }) export class SharedModule { - static forRoot(): ModuleWithProviders { return { ngModule: SharedModule, - // providers: [ - // {provide: OutClickService} - // ] }; } } diff --git a/projects/coreui-angular/src/lib/shared/template-id.directive.spec.ts b/projects/coreui-angular/src/lib/shared/template-id.directive.spec.ts new file mode 100644 index 00000000..8915f2f9 --- /dev/null +++ b/projects/coreui-angular/src/lib/shared/template-id.directive.spec.ts @@ -0,0 +1,54 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { TemplateIdDirective } from './template-id.directive'; +import { Component, computed, DebugElement, TemplateRef, viewChild } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { NgTemplateOutlet } from '@angular/common'; + +@Component({ + imports: [TemplateIdDirective, NgTemplateOutlet], + template: ` + Inner Text +
      + +
      + ` +}) +class TestComponent { + readonly templateId = viewChild(TemplateIdDirective); + + readonly id = computed(() => this.templateId()?.templateRef); +} + +describe('TemplateIdDirective', () => { + let fixture: ComponentFixture; + let component: TestComponent; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [TemplateRef] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + debugElement = fixture.debugElement.query(By.css('.test')); + component = fixture.componentInstance; + + fixture.detectChanges(); + }); + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new TemplateIdDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should create a template with innerText', () => { + expect(debugElement.nativeElement.innerText).toBe('Inner Text'); + }); + + it('should get the template id', () => { + expect(component.templateId()?.id).toBe('test'); + expect(component.templateId()?.templateRef).toEqual(jasmine.any(TemplateRef)); + }); +}); diff --git a/projects/coreui-angular/src/lib/shared/template-id.directive.ts b/projects/coreui-angular/src/lib/shared/template-id.directive.ts index c0025d76..45fc8f74 100644 --- a/projects/coreui-angular/src/lib/shared/template-id.directive.ts +++ b/projects/coreui-angular/src/lib/shared/template-id.directive.ts @@ -1,12 +1,13 @@ -import { Directive, Input, TemplateRef } from '@angular/core'; +import { Directive, inject, input, TemplateRef } from '@angular/core'; @Directive({ selector: '[cTemplateId]' }) export class TemplateIdDirective { - @Input('cTemplateId') id!: string; + readonly templateRef = inject(TemplateRef); + readonly cTemplateId = input.required(); - constructor( - public templateRef: TemplateRef - ) { } + get id() { + return this.cTemplateId(); + } } diff --git a/projects/coreui-angular/src/lib/shared/theme.directive.spec.ts b/projects/coreui-angular/src/lib/shared/theme.directive.spec.ts new file mode 100644 index 00000000..41a8f1e0 --- /dev/null +++ b/projects/coreui-angular/src/lib/shared/theme.directive.spec.ts @@ -0,0 +1,49 @@ +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ThemeDirective } from './theme.directive'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [ThemeDirective], + template: '
      ' +}) +export class TestComponent { + theme!: 'dark' | 'light' | undefined; +} + +class MockElementRef extends ElementRef {} + +describe('ThemeDirective', () => { + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [{ provide: ElementRef, useClass: MockElementRef }, Renderer2] + }); + fixture = TestBed.createComponent(TestComponent); + debugElement = fixture.debugElement.query(By.css('div')); + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new ThemeDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should set data-coreui-theme attribute', () => { + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('data-coreui-theme')).toBeNull(); + fixture.componentInstance.theme = 'dark'; + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('data-coreui-theme')).toBe('dark'); + fixture.componentInstance.theme = 'light'; + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('data-coreui-theme')).toBe('light'); + fixture.componentInstance.theme = undefined; + fixture.detectChanges(); + expect(debugElement.nativeElement.getAttribute('data-coreui-theme')).toBeNull(); + }); +}); diff --git a/projects/coreui-angular/src/lib/shared/theme.directive.ts b/projects/coreui-angular/src/lib/shared/theme.directive.ts new file mode 100644 index 00000000..d3cc3a3e --- /dev/null +++ b/projects/coreui-angular/src/lib/shared/theme.directive.ts @@ -0,0 +1,38 @@ +import { booleanAttribute, Directive, effect, ElementRef, inject, input, Renderer2, untracked } from '@angular/core'; + +@Directive({ + selector: '[cTheme]', + exportAs: 'cTheme' +}) +export class ThemeDirective { + readonly #hostElement = inject(ElementRef); + readonly #renderer = inject(Renderer2); + + /** + * Add dark theme attribute. + * @return 'dark' | 'light' | undefined + */ + readonly colorScheme = input<'dark' | 'light'>(); + + readonly #colorSchemeChange = effect(() => { + const colorScheme = this.colorScheme(); + colorScheme ? this.setTheme(colorScheme) : this.unsetTheme(); + }); + + readonly dark = input(false, { transform: booleanAttribute }); + + readonly #darkChange = effect(() => { + const darkTheme = this.dark() || untracked(this.colorScheme) === 'dark'; + darkTheme ? this.setTheme('dark') : this.unsetTheme(); + }); + + setTheme(theme?: string): void { + if (theme) { + this.#renderer.setAttribute(this.#hostElement.nativeElement, 'data-coreui-theme', theme); + } + } + + unsetTheme(): void { + this.#renderer.removeAttribute(this.#hostElement.nativeElement, 'data-coreui-theme'); + } +} diff --git a/projects/coreui-angular/src/lib/sidebar/public_api.ts b/projects/coreui-angular/src/lib/sidebar/public_api.ts index d7b2fca1..597aacc0 100644 --- a/projects/coreui-angular/src/lib/sidebar/public_api.ts +++ b/projects/coreui-angular/src/lib/sidebar/public_api.ts @@ -2,10 +2,10 @@ export { SidebarComponent } from './sidebar/sidebar.component'; export { SidebarService } from './sidebar.service'; export { SidebarBrandComponent } from './sidebar-brand/sidebar-brand.component'; export { SidebarToggleDirective } from './sidebar-toggle/sidebar-toggle.directive'; -export { SidebarTogglerComponent } from './sidebar-toggler/sidebar-toggler.component'; +export { SidebarTogglerDirective } from './sidebar-toggler/sidebar-toggler.directive'; export { SidebarHeaderComponent } from './sidebar-header/sidebar-header.component'; export { SidebarFooterComponent } from './sidebar-footer/sidebar-footer.component'; -export { SidebarNavComponent, INavData } from './sidebar-nav'; +export { SidebarNavComponent, type INavData, SidebarNavHelper } from './sidebar-nav'; export { SidebarModule } from './sidebar.module'; diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.ts index 504a2e04..f47fb468 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.ts @@ -1,4 +1,4 @@ -import { Host, Inject, Injectable, Renderer2 } from '@angular/core'; +import { inject, Injectable, Renderer2 } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { SidebarService } from '../sidebar.service'; import { SidebarComponent } from '../sidebar/sidebar.component'; @@ -7,52 +7,47 @@ import { SidebarComponent } from '../sidebar/sidebar.component'; providedIn: 'root' }) export class SidebarBackdropService { + readonly #document = inject(DOCUMENT); + readonly #sidebarService = inject(SidebarService); - private backdrop!: HTMLElement; + #backdrop!: HTMLElement; renderer!: Renderer2; - private clickListener = (): void => {}; - - constructor( - @Inject(DOCUMENT) private document: any, - // private rendererFactory: RendererFactory2, - private sidebarService: SidebarService, - ) { - // this.renderer = rendererFactory.createRenderer(null, null); - } + #clickListener = (): void => { + /* empty */ + }; setBackdrop(sidebar: SidebarComponent): void { - const backdrop = this.document.getElementsByClassName('sidebar-backdrop'); + const backdrop = this.#document.getElementsByClassName('sidebar-backdrop'); // console.log(`sidebar-${this.id}`, ' setBackdrop', backdrop); if (backdrop.length === 0) { - this.backdrop = this.renderer.createElement('div'); - this.renderer.addClass(this.backdrop, 'sidebar-backdrop'); - this.renderer.appendChild(this.document.body, this.backdrop); - this.clickListener = this.renderer.listen(this.backdrop, 'click', (e) => { + this.#backdrop = this.renderer.createElement('div'); + this.renderer.addClass(this.#backdrop, 'sidebar-backdrop'); + this.renderer.appendChild(this.#document.body, this.#backdrop); + this.#clickListener = this.renderer.listen(this.#backdrop, 'click', (e) => { // console.log(`sidebar-${this.id}`, ' backdrop click', e); - this.sidebarService.toggle({toggle: 'visible', sidebar}); + this.#sidebarService.toggle({ toggle: 'visible', sidebar }); }); } // console.log(this.backdrop, sidebar.sidebarState.mobile, sidebar.sidebarState.show); - if (this.backdrop && sidebar.sidebarState.mobile && sidebar.sidebarState.visible) { - this.renderer.addClass(this.backdrop, 'fade'); - this.renderer.addClass(this.backdrop, 'show'); + if (this.#backdrop && sidebar.sidebarState.mobile && sidebar.sidebarState.visible) { + this.renderer.addClass(this.#backdrop, 'fade'); + this.renderer.addClass(this.#backdrop, 'show'); // this.renderer.removeClass(this.backdrop, 'd-none'); } else { - this.renderer.removeClass(this.backdrop, 'show'); - this.renderer.removeClass(this.backdrop, 'fade'); + this.renderer.removeClass(this.#backdrop, 'show'); + this.renderer.removeClass(this.#backdrop, 'fade'); // this.renderer.addClass(this.backdrop, 'd-none'); } } clearBackdrop(): void { - if (this.backdrop) { + if (this.#backdrop) { // clear backdrop click Listener - this.clickListener(); + this.#clickListener(); // this.renderer.listen(this.backdrop, 'click', (e): void => {} ); - this.renderer.removeChild(this.document.body, this.backdrop); + this.renderer.removeChild(this.#document.body, this.#backdrop); // @ts-ignore - this.backdrop = undefined; + this.#backdrop = undefined; } } - } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html index 80241f0f..0a0b9008 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html @@ -1,13 +1,12 @@ - - - - +@if (brandImg()) { + + @if (brandFull()) { + + } + @if (brandNarrow()) { + + } - - - - +} @else { + +} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.spec.ts index 5c07ff65..005845ae 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.spec.ts @@ -1,21 +1,23 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Router } from '@angular/router'; +import { provideRouter, Router } from '@angular/router'; import { SidebarBrandComponent } from './sidebar-brand.component'; import { HtmlAttributesDirective } from '../../shared'; -describe('HeaderBrandComponent', () => { +describe('SidebarBrandComponent', () => { let component: SidebarBrandComponent; let fixture: ComponentFixture; let router: Router; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ RouterTestingModule.withRoutes([]) ], - declarations: [ SidebarBrandComponent, HtmlAttributesDirective ] + imports: [ + HtmlAttributesDirective, + SidebarBrandComponent + ], + providers: [provideRouter([])] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -28,4 +30,8 @@ describe('HeaderBrandComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('sidebar-brand'); + }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.ts index 8e22cd67..2d6b061b 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.ts @@ -1,20 +1,20 @@ -import { Component, HostBinding, Input, OnInit } from '@angular/core'; +import { Component, computed, input } from '@angular/core'; +import { NgClass } from '@angular/common'; +import { RouterLink, type UrlTree } from '@angular/router'; + +import { HtmlAttributesDirective } from '../../shared'; @Component({ selector: 'c-sidebar-brand', - templateUrl: './sidebar-brand.component.html' + templateUrl: './sidebar-brand.component.html', + imports: [RouterLink, HtmlAttributesDirective, NgClass], + host: { class: 'sidebar-brand' } }) -export class SidebarBrandComponent implements OnInit { - - @Input() brandFull?: any; - @Input() brandNarrow?: any; - @Input() routerLink?: any[] | string; - - @HostBinding('class.sidebar-brand') sidebarBrandClass = true; +export class SidebarBrandComponent { + readonly brandFull = input(); + readonly brandNarrow = input(); - brandImg = false; + readonly routerLink = input(); - ngOnInit(): void { - this.brandImg = Boolean(this.brandFull || this.brandNarrow); - } + readonly brandImg = computed(() => Boolean(this.brandFull() || this.brandNarrow())); } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.scss b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.spec.ts index 09afa8da..5567e8f9 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.spec.ts @@ -8,9 +8,9 @@ describe('SidebarFooterComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ SidebarFooterComponent ] + imports: [SidebarFooterComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('SidebarFooterComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('sidebar-footer'); + }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts index cdd4ba5b..25d6b5fa 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts @@ -1,18 +1,8 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-sidebar-footer', - templateUrl: './sidebar-footer.component.html', - styleUrls: ['./sidebar-footer.component.scss'] + template: '', + host: { class: 'sidebar-footer' } }) -export class SidebarFooterComponent { - - constructor() { } - - @HostBinding('class') - get hostClasses(): any { - return { - 'sidebar-footer': true - }; - } -} +export class SidebarFooterComponent {} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.scss b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.spec.ts index b7fd60b7..cf4aacc6 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.spec.ts @@ -8,9 +8,9 @@ describe('SidebarHeaderComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ SidebarHeaderComponent ] + imports: [SidebarHeaderComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('SidebarHeaderComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('sidebar-header'); + }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts index 0d8466e1..6c4b2d8b 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts @@ -1,17 +1,8 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'c-sidebar-header', - templateUrl: './sidebar-header.component.html', - styleUrls: ['./sidebar-header.component.scss'] + template: '', + host: { class: 'sidebar-header' } }) -export class SidebarHeaderComponent { - constructor() {} - - @HostBinding('class') - get hostClasses(): any { - return { - 'sidebar-header': true - }; - } -} +export class SidebarHeaderComponent {} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/public_api.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/public_api.ts index fe0b25fd..2cb183c9 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/public_api.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/public_api.ts @@ -11,6 +11,4 @@ export { SidebarNavIconPipe } from './sidebar-nav-icon.pipe'; export { SidebarNavBadgePipe } from './sidebar-nav-badge.pipe'; export { SidebarNavItemClassPipe } from './sidebar-nav-item-class.pipe'; export { SidebarNavLinkPipe } from './sidebar-nav-link.pipe'; -export { INavData } from './sidebar-nav'; - - +export type { INavData } from './sidebar-nav'; diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.ts index 3cc8001c..4a57aad7 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.ts @@ -4,7 +4,6 @@ import { Pipe, PipeTransform } from '@angular/core'; name: 'cSidebarNavBadge' }) export class SidebarNavBadgePipe implements PipeTransform { - transform(item: any, args?: any): any { const badge = item.badge; return { @@ -16,5 +15,4 @@ export class SidebarNavBadgePipe implements PipeTransform { [`${badge.class}`]: !!badge.class }; } - } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.spec.ts index 09545ff4..3f4c3896 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import {SidebarNavDividerComponent} from './sidebar-nav-divider.component'; +import { SidebarNavDividerComponent } from './sidebar-nav-divider.component'; describe('SidebarNavDividerComponent', () => { let component: SidebarNavDividerComponent; @@ -9,9 +9,9 @@ describe('SidebarNavDividerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ SidebarNavDividerComponent ], + imports: [SidebarNavDividerComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.ts index 58afbe79..436bc9a6 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.ts @@ -6,8 +6,4 @@ import { Component, Input } from '@angular/core'; }) export class SidebarNavDividerComponent { @Input() item: any; - - constructor() { - } - } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html index 2ee3ca3a..1967df91 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html @@ -2,29 +2,38 @@ [cHtmlAttr]="item.attributes" class="nav-link nav-group-toggle" href> - + {{ item.name }} - {{ item.badge.text }} + @if (helper.hasBadge(item)) { + {{ item.badge.text }} + } - +/> - - + + @if (item?.icon) { + + + + } + @if (item?.iconComponent) { - - + /> + } + @if (!item?.icon && !item?.iconComponent) { + + } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.spec.ts index d7b04abd..b6be615f 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.spec.ts @@ -1,16 +1,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Router } from '@angular/router'; - -import { SidebarNavDividerComponent } from './sidebar-nav-divider.component'; +import { provideRouter, Router } from '@angular/router'; import { SidebarNavGroupComponent } from './sidebar-nav.component'; -import { SidebarNavLabelComponent } from './sidebar-nav-label.component'; -import { SidebarNavLinkComponent } from './sidebar-nav-link.component'; -import { SidebarNavTitleComponent } from './sidebar-nav-title.component'; -import { SidebarNavIconPipe } from './sidebar-nav-icon.pipe'; -import { HtmlAttributesDirective } from '../../shared'; -import { SidebarModule } from '../sidebar.module'; describe('SidebarNavGroupComponent', () => { let component: SidebarNavGroupComponent; @@ -20,18 +11,13 @@ describe('SidebarNavGroupComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ RouterTestingModule.withRoutes([]), SidebarModule, NoopAnimationsModule ], - declarations: [ - SidebarNavDividerComponent, - SidebarNavGroupComponent, - SidebarNavLabelComponent, - SidebarNavLinkComponent, - SidebarNavTitleComponent, - HtmlAttributesDirective, - SidebarNavIconPipe, + imports: [ + NoopAnimationsModule, + SidebarNavGroupComponent ], + providers: [provideRouter([])] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -39,7 +25,7 @@ describe('SidebarNavGroupComponent', () => { router = TestBed.inject(Router); component = fixture.componentInstance; - item = { + item = { name: 'Tables', url: '/tables', icon: 'icon-list', @@ -57,7 +43,7 @@ describe('SidebarNavGroupComponent', () => { name: 'Standard Tables', url: '/tables/tables', icon: 'icon-list' - }, + } ] }; component.item = item; @@ -68,4 +54,8 @@ describe('SidebarNavGroupComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('nav-group'); + }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.service.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.service.ts index ce6b237a..e1b3106a 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.service.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.service.ts @@ -10,9 +10,6 @@ export interface ISidebarAction { @Injectable() export class SidebarNavGroupService { - - constructor() { } - private sidebarNavGroupState = new BehaviorSubject({}); sidebarNavGroupState$ = this.sidebarNavGroupState.asObservable(); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.ts index c8883a2f..0fd96a44 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.ts @@ -4,13 +4,11 @@ import { Pipe, PipeTransform } from '@angular/core'; name: 'cSidebarNavIcon' }) export class SidebarNavIconPipe implements PipeTransform { - transform(item: any, args?: any): any { const icon = item.icon; - const classes = { + return { 'nav-icon': true, [`${icon}`]: !!icon }; - return classes; } } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.spec.ts index 295bf035..69eb2fe3 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.spec.ts @@ -1,11 +1,15 @@ import { SidebarNavItemClassPipe } from './sidebar-nav-item-class.pipe'; -import {SidebarNavHelper} from './sidebar-nav.service'; -import { INavData } from './sidebar-nav'; +import { TestBed } from '@angular/core/testing'; +import { SidebarNavHelper } from './sidebar-nav.service'; describe('SidebarNavItemClassPipe', () => { it('create an instance', () => { - const helper = new SidebarNavHelper(); - const pipe = new SidebarNavItemClassPipe(helper); - expect(pipe).toBeTruthy(); + TestBed.configureTestingModule({ + providers: [SidebarNavHelper] + }); + TestBed.runInInjectionContext(() => { + const pipe = new SidebarNavItemClassPipe(); + expect(pipe).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.ts index 864171d9..5de1ed20 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.ts @@ -1,28 +1,25 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { inject, Pipe, PipeTransform } from '@angular/core'; -import {SidebarNavHelper} from './sidebar-nav.service'; +import { SidebarNavHelper } from './sidebar-nav.service'; @Pipe({ name: 'cSidebarNavItemClass' }) export class SidebarNavItemClassPipe implements PipeTransform { - - constructor( - public helper: SidebarNavHelper - ) {} + readonly helper = inject(SidebarNavHelper); // transform(item: any, ...args: any[]): any { transform(item: any, args?: any[]): any { - const itemType = this.helper.itemType(item); - let itemClass; - if (['divider', 'title'].includes(itemType)) { - itemClass = `nav-${itemType}`; - } else if (itemType === 'group') { - // itemClass = 'c-sidebar-nav-group' ; - itemClass = '' ; - } else { - itemClass = 'nav-item'; - } - return item.class ? `${itemClass} ${item.class}` : itemClass; + const itemType = this.helper.itemType(item); + let itemClass; + if (['divider', 'title'].includes(itemType)) { + itemClass = `nav-${itemType}`; + } else if (itemType === 'group') { + // itemClass = 'c-sidebar-nav-group' ; + itemClass = ''; + } else { + itemClass = 'nav-item'; } + return item.class ? `${itemClass} ${item.class}` : itemClass; + } } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.html index 44266100..d814c644 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.html @@ -1,7 +1,11 @@ - - + + @if (helper.hasIcon(item)) { + + } {{ item.name }} - {{ item.badge.text }} + @if (helper.hasBadge(item)) { + {{ item.badge.text }} + } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.spec.ts index 17b68301..ae5954bb 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.spec.ts @@ -1,8 +1,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import {SidebarNavLabelComponent} from './sidebar-nav-label.component'; -import {SidebarNavHelper} from './sidebar-nav.service'; -import { SharedModule } from '../../shared'; +import { SidebarNavLabelComponent } from './sidebar-nav-label.component'; +import { SidebarNavHelper } from './sidebar-nav.service'; // import {LayoutModule} from '../../shared/layout/index.ts_'; describe('SidebarNavLabelComponent', () => { @@ -12,11 +11,10 @@ describe('SidebarNavLabelComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ SidebarNavLabelComponent ], - providers: [ SidebarNavHelper ], - imports: [ SharedModule ], + providers: [SidebarNavHelper], + imports: [SidebarNavLabelComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.ts index af5d2958..062bda42 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-label.component.ts @@ -1,11 +1,18 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {SidebarNavHelper} from './sidebar-nav.service'; +import { Component, inject, Input, OnInit } from '@angular/core'; +import { NgClass } from '@angular/common'; + +import { HtmlAttributesDirective } from '../../shared'; +import { SidebarNavHelper } from './sidebar-nav.service'; +import { SidebarNavBadgePipe } from './sidebar-nav-badge.pipe'; @Component({ selector: 'c-sidebar-nav-label', - templateUrl: './sidebar-nav-label.component.html' + templateUrl: './sidebar-nav-label.component.html', + imports: [HtmlAttributesDirective, SidebarNavBadgePipe, NgClass] }) export class SidebarNavLabelComponent implements OnInit { + readonly helper = inject(SidebarNavHelper); + @Input() item: any; private classes = { @@ -14,10 +21,6 @@ export class SidebarNavLabelComponent implements OnInit { }; private iconClasses = {}; - constructor( - public helper: SidebarNavHelper - ) { } - ngOnInit() { this.iconClasses = this.helper.getIconClass(this.item); } @@ -28,6 +31,7 @@ export class SidebarNavLabelComponent implements OnInit { this.classes[itemClass] = !!itemClass; return this.classes; } + getLabelIconClass() { const variant = `text-${this.item.label.variant}`; // @ts-ignore diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html index fadc7999..921d6f39 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html @@ -1,53 +1,62 @@ - - - - - {{ item.badge?.text }} - - - - - {{ item.badge?.text }} - - - - - - {{ item.badge?.text }} - - - +@switch (linkType) { + @case ('disabled') { + + + + @if (item.badge) { + {{ item.badge?.text }} + } + + } + @case ('external') { + + + + @if (item.badge) { + {{ item.badge?.text }} + } + + } + @default { + + + + + @if (item.badge) { + {{ item.badge?.text }} + } + + } +} - - + + @if (item?.icon) { + + + + } + @if (item?.iconComponent) { - - + } + @if (!item?.icon && !item?.iconComponent) { + + } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.spec.ts index 1f6146f7..a1e66298 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.spec.ts @@ -3,11 +3,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { Router } from '@angular/router'; import { SidebarNavLinkComponent } from './sidebar-nav-link.component'; -import { SidebarNavLinkPipe } from './sidebar-nav-link.pipe'; -import { SidebarNavBadgePipe } from './sidebar-nav-badge.pipe'; -import { SidebarNavIconPipe } from './sidebar-nav-icon.pipe'; import { HtmlAttributesDirective } from '../../shared'; -import { SidebarModule } from '../sidebar.module'; describe('SidebarNavLinkComponent', () => { let component: SidebarNavLinkComponent; @@ -17,8 +13,10 @@ describe('SidebarNavLinkComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule.withRoutes([]), SidebarModule], - declarations: [SidebarNavLinkComponent, HtmlAttributesDirective, SidebarNavLinkPipe, SidebarNavBadgePipe, SidebarNavIconPipe] + imports: [RouterTestingModule.withRoutes([]), + HtmlAttributesDirective, + SidebarNavLinkComponent + ] }) .compileComponents(); })); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts index 0614f3fe..561a65aa 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts @@ -1,82 +1,92 @@ -import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core'; -import {NavigationEnd, Router} from '@angular/router'; -import {Observable, Subscription} from 'rxjs'; -import {filter} from 'rxjs/operators'; +import { NgClass, NgTemplateOutlet } from '@angular/common'; +import { Component, inject, Input, OnDestroy, OnInit, output } from '@angular/core'; +import { NavigationEnd, Router, RouterModule } from '@angular/router'; +import { Observable, Subscription } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import { IconDirective } from '@coreui/icons-angular'; -import {SidebarNavHelper} from './sidebar-nav.service'; // import {SidebarService} from '../sidebar.service'; +import { HtmlAttributesDirective } from '../../shared'; +import { SidebarNavHelper } from './sidebar-nav.service'; import { INavData } from './sidebar-nav'; +import { SidebarNavLinkPipe } from './sidebar-nav-link.pipe'; +import { SidebarNavBadgePipe } from './sidebar-nav-badge.pipe'; +import { SidebarNavIconPipe } from './sidebar-nav-icon.pipe'; @Component({ selector: 'c-sidebar-nav-link-content', template: ` - - {{item?.name ?? ''}} - + @if (true) { + {{ item?.name ?? '' }} + } `, - providers: [ SidebarNavHelper ] + providers: [SidebarNavHelper] }) export class SidebarNavLinkContentComponent { - @Input() item?: INavData; + readonly helper = inject(SidebarNavHelper); - constructor( - public helper: SidebarNavHelper - ) { } + @Input() item?: INavData; } @Component({ selector: 'c-sidebar-nav-link', templateUrl: './sidebar-nav-link.component.html', - providers: [ SidebarNavHelper ] + providers: [SidebarNavHelper], + imports: [ + RouterModule, + HtmlAttributesDirective, + IconDirective, + SidebarNavLinkContentComponent, + SidebarNavLinkPipe, + SidebarNavBadgePipe, + SidebarNavIconPipe, + NgTemplateOutlet, + NgClass + ] }) export class SidebarNavLinkComponent implements OnInit, OnDestroy { + readonly router = inject(Router); - // tslint:disable-next-line:variable-name protected _item: INavData = {}; @Input() set item(item: INavData) { this._item = JSON.parse(JSON.stringify(item)); } + get item(): INavData { return this._item; } - @Output() linkClick = new EventEmitter(); + readonly linkClick = output(); - // @ts-ignore - public linkType: string; - // @ts-ignore - public href: string; - // @ts-ignore - public linkActive: boolean; - // @ts-ignore - private url: string; + public linkType!: string; + public href!: string; + public linkActive!: boolean; + private url!: string; private navigationEndObservable: Observable; - // @ts-ignore - private navSubscription: Subscription; - - constructor( - public router: Router, - // private renderer: Renderer2, - // private hostElement: ElementRef, - // private sidebarService: SidebarService - ) { + private navSubscription!: Subscription; + + constructor() { + const router = this.router; + this.navigationEndObservable = router.events.pipe( - filter(event => { + filter((event) => { return event instanceof NavigationEnd; }) ) as Observable; } ngOnInit(): void { - // @ts-ignore - this.url = typeof this.item.url === 'string' ? this.item.url : this.router.serializeUrl(this.router.createUrlTree(this.item.url)) ; + this.url = + typeof this.item.url === 'string' + ? this.item.url + : this.router.serializeUrl(this.router.createUrlTree((this.item.url as any[]) ?? [''])); this.linkType = this.getLinkType(); - this.href = this.isDisabled() ? '' : (this.item.href || this.url); + this.href = this.isDisabled() ? '' : this.item.href || this.url; this.linkActive = this.router.url.split(/[?#(;]/)[0] === this.href.split(/[?#(;]/)[0]; - this.navSubscription = this.navigationEndObservable.subscribe(event => { + this.navSubscription = this.navigationEndObservable.subscribe((event) => { const itemUrlArray = this.href.split(/[?#(;]/)[0].split('/'); const urlArray = event.urlAfterRedirects.split(/[?#(;]/)[0].split('/'); this.linkActive = itemUrlArray.every((value, index) => value === urlArray[index]); @@ -84,7 +94,7 @@ export class SidebarNavLinkComponent implements OnInit, OnDestroy { } ngOnDestroy(): void { - this.navSubscription.unsubscribe(); + this.navSubscription?.unsubscribe(); } public getLinkType(): string { @@ -97,7 +107,7 @@ export class SidebarNavLinkComponent implements OnInit, OnDestroy { public isExternalLink(): boolean { const linkPath = Array.isArray(this.item.url) ? this.item.url[0] : this.item.url; - return !!this.item.href || linkPath.substring(0, 4) === 'http'; + return !!this.item.href || linkPath?.substring(0, 4) === 'http'; } linkClicked(): void { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.ts index 2aaab10d..1aa5890b 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.ts @@ -4,17 +4,14 @@ import { Pipe, PipeTransform } from '@angular/core'; name: 'cSidebarNavLink' }) export class SidebarNavLinkPipe implements PipeTransform { - transform(item: any): any { - const disabled = item?.attributes?.disabled; - const classes = { + return { 'nav-link': true, disabled, 'btn-link': disabled, [`nav-link-${item.variant}`]: !!item.variant }; - return classes; } } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.spec.ts index ebb584d0..987278ea 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.spec.ts @@ -9,9 +9,9 @@ describe('SidebarNavTitleComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ SidebarNavTitleComponent ] + imports: [SidebarNavTitleComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.ts index 09e2ec78..cfa07af0 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-title.component.ts @@ -1,40 +1,38 @@ -import {Component, ElementRef, Input, OnInit, Renderer2} from '@angular/core'; +import { Component, ElementRef, inject, Input, OnInit, Renderer2 } from '@angular/core'; @Component({ selector: 'c-sidebar-nav-title', - template: '', + template: '' }) export class SidebarNavTitleComponent implements OnInit { - @Input() item: any; + readonly #elementRef = inject(ElementRef); + readonly #renderer = inject(Renderer2); - constructor( - private el: ElementRef, - private renderer: Renderer2, - ) {} + @Input() item: any; ngOnInit(): void { - const nativeElement: HTMLElement = this.el.nativeElement; - const name = this.renderer.createText(this.item.name); + const nativeElement: HTMLElement = this.#elementRef.nativeElement; + const name = this.#renderer.createText(this.item.name); - if ( this.item.class ) { + if (this.item.class) { const classes = this.item.class; - this.renderer.addClass(nativeElement, classes); + this.#renderer.addClass(nativeElement, classes); } - if ( this.item.wrapper ) { - const wrapper = this.renderer.createElement(this.item.wrapper.element); + if (this.item.wrapper) { + const wrapper = this.#renderer.createElement(this.item.wrapper.element); this.addAttribs(this.item.wrapper.attributes, wrapper); - this.renderer.appendChild(wrapper, name); - this.renderer.appendChild(nativeElement, wrapper); + this.#renderer.appendChild(wrapper, name); + this.#renderer.appendChild(nativeElement, wrapper); } else { - this.renderer.appendChild(nativeElement, name); + this.#renderer.appendChild(nativeElement, name); } } - private addAttribs(attribs: { [x: string]: any; }, element: any): void { + private addAttribs(attribs: { [x: string]: any }, element: any): void { if (attribs) { for (const attr in attribs) { - if (attr === 'style' && typeof(attribs[attr]) === 'object' ) { + if (attr === 'style' && typeof attribs[attr] === 'object') { this.setStyle(attribs[attr], element); } else if (attr === 'class') { this.addClass(attribs[attr], element); @@ -45,22 +43,24 @@ export class SidebarNavTitleComponent implements OnInit { } } - private setStyle(styles: { [x: string]: any; }, el: any): void { + private setStyle(styles: { [x: string]: any }, el: any): void { for (const style in styles) { if (style) { - this.renderer.setStyle(el, style, styles[style]); + this.#renderer.setStyle(el, style, styles[style]); } } } - private addClass(classes: string | Array, el: any): void { - const classArray = (Array.isArray(classes) ? classes : classes.split(' ')); - classArray.filter((element) => element.length > 0).forEach(element => { - this.renderer.addClass(el, element ); - }); + private addClass(classes: string | string[], el: any): void { + const classArray = Array.isArray(classes) ? classes : classes.split(' '); + classArray + .filter((element) => element.length > 0) + .forEach((element) => { + this.#renderer.addClass(el, element); + }); } private setAttrib(key: string, value: string, el: any): void { - this.renderer.setAttribute(el, key, value ); + this.#renderer.setAttribute(el, key, value); } } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html index 7295438c..c3976dc0 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html @@ -1,42 +1,46 @@ - - - - - - - - - - - - - - - - - +@for (item of navItemsArray; track item) { + @switch (helper.itemType(item)) { + @case ('group') { + + } + @case ('divider') { + + } + @case ('title') { + + } + @case ('label') { + + } + @case ('empty') { + + } + @default { + + } + } +} + diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.scss b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.spec.ts index 911bbb6b..95aeab19 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.spec.ts @@ -1,42 +1,25 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { Router } from '@angular/router'; -import { SidebarNavComponent, SidebarNavGroupComponent } from './sidebar-nav.component'; +import { SidebarNavComponent } from './sidebar-nav.component'; import { SidebarNavHelper } from './sidebar-nav.service'; // import { SidebarNavGroupComponent } from './sidebar-nav-group.component'; -import { SidebarNavDividerComponent } from './sidebar-nav-divider.component'; -import { SidebarNavLabelComponent } from './sidebar-nav-label.component'; -import { SidebarNavLinkComponent } from './sidebar-nav-link.component'; -import { SidebarNavTitleComponent } from './sidebar-nav-title.component'; -import { HtmlAttributesDirective, SharedModule } from '../../shared'; describe('SidebarNavComponent', () => { let component: SidebarNavComponent; let fixture: ComponentFixture; - let router: Router; - let navItems: Array; + let navItems: any[]; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ RouterTestingModule.withRoutes([]), SharedModule ], - declarations: [ - SidebarNavComponent, - SidebarNavGroupComponent, - SidebarNavDividerComponent, - SidebarNavLabelComponent, - SidebarNavLinkComponent, - SidebarNavTitleComponent, - HtmlAttributesDirective - ], - providers: [ SidebarNavHelper ], - }) - .compileComponents(); + imports: [RouterTestingModule.withRoutes([]), SidebarNavComponent], + declarations: [], + providers: [SidebarNavHelper] + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(SidebarNavComponent); - router = TestBed.inject(Router); component = fixture.componentInstance; // mock items supplied by the parent component @@ -60,4 +43,8 @@ describe('SidebarNavComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('sidebar-nav'); + }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts index 786533a1..f8e96985 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts @@ -1,18 +1,21 @@ +import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; +import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common'; import { + booleanAttribute, Component, ElementRef, + forwardRef, HostBinding, + inject, Input, OnChanges, OnDestroy, OnInit, - Optional, Renderer2, SimpleChanges, ViewChild } from '@angular/core'; -import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; -import { NavigationEnd, Router } from '@angular/router'; +import { NavigationEnd, Router, RouterModule } from '@angular/router'; import { Observable, Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; @@ -21,85 +24,59 @@ import { SidebarComponent } from '../sidebar/sidebar.component'; import { INavData } from './sidebar-nav'; import { SidebarNavHelper } from './sidebar-nav.service'; import { SidebarNavGroupService } from './sidebar-nav-group.service'; - -@Component({ - selector: 'c-sidebar-nav', - templateUrl: './sidebar-nav.component.html', - styleUrls: ['./sidebar-nav.component.scss'] -}) -export class SidebarNavComponent implements OnChanges { - - constructor( - @Optional() public sidebar: SidebarComponent, - public helper: SidebarNavHelper, - public router: Router, - private renderer: Renderer2, - private hostElement: ElementRef, - private sidebarService: SidebarService - ) { } - - @Input() navItems?: INavData[] = []; - @Input() dropdownMode: 'path' | 'none' | 'close' = 'path'; - @Input() groupItems?: boolean; - @Input() compact?: boolean; - - @HostBinding('class') - get hostClasses(): any { - return { - 'sidebar-nav': !this.groupItems, - compact: !this.groupItems && !!this.compact - }; - } - - @HostBinding('class.nav-group-items') - get sidebarNavGroupItemsClass(): boolean { - return !!this.groupItems; - } - - @HostBinding('attr.role') role = 'nav'; - - public navItemsArray: INavData[] = []; - - public ngOnChanges(changes: SimpleChanges): void { - this.navItemsArray = Array.isArray(this.navItems) ? this.navItems.slice() : []; - } - - public hideMobile(): void { - // todo: proper scrollIntoView() after NavigationEnd - if (this.sidebar && this.sidebar.sidebarState.mobile) { - this.sidebarService.toggle({ toggle: 'visible', sidebar: this.sidebar }); - } - } -} +import { HtmlAttributesDirective } from '../../shared'; +import { SidebarNavIconPipe } from './sidebar-nav-icon.pipe'; +import { SidebarNavBadgePipe } from './sidebar-nav-badge.pipe'; +import { SidebarNavLinkComponent } from './sidebar-nav-link.component'; +import { SidebarNavLabelComponent } from './sidebar-nav-label.component'; +import { SidebarNavTitleComponent } from './sidebar-nav-title.component'; +import { SidebarNavDividerComponent } from './sidebar-nav-divider.component'; +import { SidebarNavItemClassPipe } from './sidebar-nav-item-class.pipe'; +import { IconDirective } from '@coreui/icons-angular'; @Component({ selector: 'c-sidebar-nav-group', templateUrl: './sidebar-nav-group.component.html', styleUrls: ['./sidebar-nav-group.component.scss'], - providers: [SidebarNavHelper], + providers: [SidebarNavHelper, SidebarNavGroupService], + imports: [ + HtmlAttributesDirective, + IconDirective, + NgTemplateOutlet, + NgClass, + SidebarNavIconPipe, + SidebarNavBadgePipe, + forwardRef(() => SidebarNavComponent), + NgStyle + ], animations: [ trigger('openClose', [ - state('open', style({ - height: '*' - })), - state('closed', style({ - height: '0px' - })), - transition('open <=> closed', [ - animate('.15s ease') - ]) + state( + 'open', + style({ + height: '*' + }) + ), + state( + 'closed', + style({ + height: '0px' + }) + ), + transition('open <=> closed', [animate('.15s ease')]) ]) ] }) export class SidebarNavGroupComponent implements OnInit, OnDestroy { + readonly #router = inject(Router); + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + readonly #sidebarNavGroupService = inject(SidebarNavGroupService); + public readonly helper = inject(SidebarNavHelper); + + constructor() { + const router = this.#router; - constructor( - private router: Router, - private renderer: Renderer2, - private hostElement: ElementRef, - public helper: SidebarNavHelper, - private sidebarNavGroupService: SidebarNavGroupService - ) { this.navigationEndObservable = router.events.pipe( filter((event: any) => event instanceof NavigationEnd) ) as Observable; @@ -108,6 +85,7 @@ export class SidebarNavGroupComponent implements OnInit, OnDestroy { @Input() item: any; @Input() dropdownMode: 'path' | 'none' | 'close' = 'path'; @Input() show?: boolean; + @Input({ transform: booleanAttribute }) compact?: boolean; @HostBinding('class') get hostClasses(): any { @@ -117,7 +95,7 @@ export class SidebarNavGroupComponent implements OnInit, OnDestroy { }; } - @ViewChild(SidebarNavComponent, { read: ElementRef }) sidebarNav!: ElementRef; + @ViewChild(forwardRef(() => SidebarNavComponent), { read: ElementRef }) sidebarNav!: ElementRef; navigationEndObservable: Observable; navSubscription!: Subscription; @@ -128,7 +106,6 @@ export class SidebarNavGroupComponent implements OnInit, OnDestroy { public display: any = { display: 'block' }; ngOnInit(): void { - this.navItems = [...this.item.children]; this.navSubscription = this.navigationEndObservable.subscribe((event: NavigationEnd) => { @@ -138,16 +115,16 @@ export class SidebarNavGroupComponent implements OnInit, OnDestroy { } }); - if (this.samePath(this.router.routerState.snapshot.url)) { + if (this.samePath(this.#router.routerState.snapshot.url)) { this.openGroup(true); } - this.navGroupSubscription = this.sidebarNavGroupService.sidebarNavGroupState$.subscribe(next => { + this.navGroupSubscription = this.#sidebarNavGroupService.sidebarNavGroupState$.subscribe((next) => { if (this.dropdownMode === 'close' && next.sidebarNavGroup && next.sidebarNavGroup !== this) { if (next.sidebarNavGroup.item.url.startsWith(this.item.url)) { return; } - if (this.samePath(this.router.routerState.snapshot.url)) { + if (this.samePath(this.#router.routerState.snapshot.url)) { this.openGroup(true); return; } @@ -174,31 +151,95 @@ export class SidebarNavGroupComponent implements OnInit, OnDestroy { $event.preventDefault(); this.openGroup(!this.open); if (this.open) { - this.sidebarNavGroupService.toggle({ open: this.open, sidebarNavGroup: this }); + this.#sidebarNavGroupService.toggle({ open: this.open, sidebarNavGroup: this }); } } ngOnDestroy(): void { - this.navSubscription.unsubscribe(); + this.navSubscription?.unsubscribe(); } onAnimationStart($event: AnimationEvent) { this.display = { display: 'block' }; - if ($event.toState === 'open') { - const host = this.sidebarNav.nativeElement; - this.renderer.setStyle(host, 'height', `${host['scrollHeight']}px`); - } + setTimeout(() => { + const host = this.sidebarNav?.nativeElement; + if ($event.toState === 'open' && host) { + this.#renderer.setStyle(host, 'height', `${host['scrollHeight']}px`); + } + }); } onAnimationDone($event: AnimationEvent) { - if ($event.toState === 'open') { - const host = this.sidebarNav.nativeElement; - this.renderer.setStyle(host, 'height', 'auto'); - } - if ($event.toState === 'closed') { - setTimeout(() => { - this.display = null; - }); + setTimeout(() => { + const host = this.sidebarNav?.nativeElement; + if ($event.toState === 'open' && host) { + this.#renderer.setStyle(host, 'height', 'auto'); + } + if ($event.toState === 'closed') { + setTimeout(() => { + this.display = null; + }); + } + }); + } +} + +@Component({ + selector: 'c-sidebar-nav', + templateUrl: './sidebar-nav.component.html', + imports: [ + NgClass, + HtmlAttributesDirective, + SidebarNavLinkComponent, + SidebarNavLabelComponent, + SidebarNavTitleComponent, + SidebarNavDividerComponent, + forwardRef(() => SidebarNavGroupComponent), + SidebarNavItemClassPipe, + RouterModule + ] +}) +export class SidebarNavComponent implements OnChanges { + readonly sidebar = inject(SidebarComponent, { optional: true }); + readonly helper = inject(SidebarNavHelper); + readonly router = inject(Router); + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + readonly #sidebarService = inject(SidebarService); + + @Input() navItems?: INavData[] = []; + @Input() dropdownMode: 'path' | 'none' | 'close' = 'path'; + @Input({ transform: booleanAttribute }) groupItems?: boolean; + @Input({ transform: booleanAttribute }) compact?: boolean; + + @HostBinding('class') + get hostClasses(): any { + return { + 'sidebar-nav': !this.groupItems, + 'nav-group-items': this.groupItems, + compact: this.groupItems && this.compact + }; + } + + // @HostBinding('class.nav-group-items') + // get sidebarNavGroupItemsClass(): boolean { + // return !!this.groupItems; + // } + + @HostBinding('attr.role') + @Input() + role = 'navigation'; + + public navItemsArray: INavData[] = []; + + public ngOnChanges(changes: SimpleChanges): void { + this.navItemsArray = Array.isArray(this.navItems) ? this.navItems.slice() : []; + } + + public hideMobile(): void { + // todo: proper scrollIntoView() after NavigationEnd + if (this.sidebar && this.sidebar.sidebarState.mobile) { + this.#sidebarService.toggle({ toggle: 'visible', sidebar: this.sidebar }); } } } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.service.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.service.spec.ts index 90fe7434..f0f2f887 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.service.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.service.spec.ts @@ -1,6 +1,6 @@ import { TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import {Router, Routes} from '@angular/router'; +import { Router, Routes } from '@angular/router'; import { SidebarNavHelper } from './sidebar-nav.service'; @@ -8,14 +8,14 @@ describe('SidebarNavHelper', () => { let service: SidebarNavHelper; let router: RouterTestingModule; const routes: Routes = [ - {path: 'dashboard', redirectTo: 'home', pathMatch: 'full'}, - {path: '', redirectTo: 'dashboard', pathMatch: 'full'} + { path: 'dashboard', redirectTo: 'home', pathMatch: 'full' }, + { path: '', redirectTo: 'dashboard', pathMatch: 'full' } ]; beforeEach(() => { TestBed.configureTestingModule({ imports: [RouterTestingModule.withRoutes(routes)], - providers: [SidebarNavHelper], + providers: [SidebarNavHelper] }); router = TestBed.inject(Router); @@ -26,40 +26,45 @@ describe('SidebarNavHelper', () => { expect(service).toBeTruthy(); }); it('should return itemType', () => { - expect(service.itemType({divider: true})).toEqual('divider'); - expect(service.itemType({title: true})).toEqual('title'); - expect(service.itemType({children: [{ - name: 'Dropdown', - url: '/dashboard', - }]})).toEqual('group'); - expect(service.itemType({label: { variant: 'info' }})).toEqual('label'); + expect(service.itemType({ divider: true })).toEqual('divider'); + expect(service.itemType({ title: true })).toEqual('title'); + expect(service.itemType({ + children: [{ + name: 'Dropdown', + url: '/dashboard' + }] + })).toEqual('group'); + expect(service.itemType({ label: { variant: 'info' } })).toEqual('label'); expect(service.itemType({})).toEqual('empty'); expect(service.itemType({ - name: 'Disabled', - url: '/dashboard', - icon: 'icon-ban', - attributes: { disabled: true }, - } + name: 'Disabled', + url: '/dashboard', + icon: 'icon-ban', + attributes: { disabled: true } + } )).toEqual('link'); }); it('should be active', () => { - expect(service.isActive(router, {url: ''})).toBeTruthy(); - expect(service.isActive(router, {url: 'dashboard'})).toBeFalsy(); + expect(service.isActive(router, { url: '' })).toBeTruthy(); + expect(service.isActive(router, { url: 'dashboard' })).toBeFalsy(); }); it('item hasBadge', () => { - expect(service.hasBadge({badge: {text: 'badge', color: 'info'}})).toBeTruthy(); + expect(service.hasBadge({ badge: { text: 'badge', color: 'info' } })).toBeTruthy(); expect(service.hasBadge({})).toBeFalsy(); }); it('item hasIcon', () => { - expect(service.hasIcon({icon: 'icon-ban'})).toBeTruthy(); + expect(service.hasIcon({ icon: 'icon-ban' })).toBeTruthy(); expect(service.hasIcon({})).toBeFalsy(); }); it('should return icon class object', () => { - expect(service.getIconClass({icon: 'icon-ban'})).toEqual(jasmine.objectContaining({ 'nav-icon': true, 'icon-ban': true})); - expect(service.getIconClass({icon: 'icon-ban'})).toEqual(jasmine.objectContaining({ 'nav-icon': true })); - expect(service.getIconClass({icon: ''})).toEqual(jasmine.objectContaining({ 'nav-icon': true })); + expect(service.getIconClass({ icon: 'icon-ban' })).toEqual(jasmine.objectContaining({ + 'nav-icon': true, + 'icon-ban': true + })); + expect(service.getIconClass({ icon: 'icon-ban' })).toEqual(jasmine.objectContaining({ 'nav-icon': true })); + expect(service.getIconClass({ icon: '' })).toEqual(jasmine.objectContaining({ 'nav-icon': true })); }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.spec.ts index 823edc92..5330d76c 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.spec.ts @@ -3,17 +3,16 @@ import { SidebarService } from '../sidebar.service'; import { SidebarToggleDirective } from './sidebar-toggle.directive'; describe('SidebarToggleDirective', () => { - beforeEach(async () => { await TestBed.configureTestingModule({ providers: [SidebarService] - }) - .compileComponents(); + }).compileComponents(); }); it('should create an instance', () => { - const service = new SidebarService(); - const directive = new SidebarToggleDirective(service); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new SidebarToggleDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.ts index 748ed2a4..4e5d4548 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.ts @@ -1,36 +1,35 @@ -import {Directive, HostListener, Input} from '@angular/core'; +import { Directive, inject, input } from '@angular/core'; -import {SidebarService} from '../sidebar.service'; +import { SidebarService } from '../sidebar.service'; /** * Allows the sidebar to be toggled/folded via click on host element. */ @Directive({ selector: '[cSidebarToggle]', - exportAs: 'cSidebarToggle' + exportAs: 'cSidebarToggle', + host: { + '(click)': 'toggleOpen($event)' + } }) export class SidebarToggleDirective { + readonly #sidebarService = inject(SidebarService); + /** - * Id of sidebar for toggle action. [docs] - * - * @type string + * Id of sidebar for toggle action. + * @return string */ - @Input('cSidebarToggle') id?: string; + readonly id = input(undefined, { alias: 'cSidebarToggle' }); /** - * Sidebar property name for toggle action. [docs] + * Sidebar property name for toggle action. * - * @type 'visible' | 'unfoldable' + * @return 'visible' | 'unfoldable' * @default 'visible' */ - @Input() toggle: 'visible' | 'unfoldable' = 'visible' - - constructor( - private sidebarService: SidebarService - ) {} + readonly toggle = input<'visible' | 'unfoldable'>('visible'); - @HostListener('click', ['$event']) toggleOpen($event: any): void { $event.preventDefault(); - this.sidebarService.toggle({ toggle: this.toggle, id: this.id }); + this.#sidebarService.toggle({ toggle: this.toggle(), id: this.id() }); } } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.component.ts deleted file mode 100644 index fa0321dd..00000000 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component, HostBinding, Input } from '@angular/core'; - -@Component({ - selector: 'c-sidebar-toggler', - template: ``, -}) -export class SidebarTogglerComponent { - - @HostBinding('attr.role') - @Input() role = 'button'; - - @HostBinding('class.sidebar-toggler') sidebarTogglerClass = true; -} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.ts new file mode 100644 index 00000000..89d5ec46 --- /dev/null +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.ts @@ -0,0 +1,23 @@ +import { Directive, input } from '@angular/core'; +import { SidebarToggleDirective } from '../sidebar-toggle/sidebar-toggle.directive'; + +@Directive({ + selector: '[cSidebarToggler]', + hostDirectives: [{ directive: SidebarToggleDirective, inputs: ['cSidebarToggle: cSidebarToggler', 'toggle'] }], + host: { + '[attr.role]': 'role()', + class: 'sidebar-toggler', + '[style]': 'getStyles' + } +}) +export class SidebarTogglerDirective { + readonly role = input('button'); + + get getStyles(): any { + return { + appearance: 'button', + 'align-items': 'flex-start', + cursor: 'pointer' + }; + } +} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts b/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts index 3255d196..1cf1d4d1 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts @@ -1,20 +1,14 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; - -import { IconModule } from '@coreui/icons-angular'; import { SidebarComponent } from './sidebar/sidebar.component'; import { SidebarService } from './sidebar.service'; import { SidebarBrandComponent } from './sidebar-brand/sidebar-brand.component'; import { SidebarToggleDirective } from './sidebar-toggle/sidebar-toggle.directive'; -import { SidebarTogglerComponent } from './sidebar-toggler/sidebar-toggler.component'; +import { SidebarTogglerDirective } from './sidebar-toggler/sidebar-toggler.directive'; import { SidebarHeaderComponent } from './sidebar-header/sidebar-header.component'; import { SidebarFooterComponent } from './sidebar-footer/sidebar-footer.component'; import { SidebarNavGroupService } from './sidebar-nav/sidebar-nav-group.service'; -import { SharedModule } from '../shared'; - import { SidebarNavBadgePipe, SidebarNavComponent, @@ -30,19 +24,16 @@ import { SidebarNavTitleComponent } from './sidebar-nav'; - - @NgModule({ - declarations: [ + imports: [ SidebarComponent, - SidebarTogglerComponent, - SidebarToggleDirective, SidebarBrandComponent, - SidebarNavBadgePipe, + SidebarFooterComponent, + SidebarHeaderComponent, SidebarNavComponent, + SidebarNavBadgePipe, SidebarNavDividerComponent, SidebarNavGroupComponent, - // SidebarNavGroupToggleDirective, SidebarNavIconPipe, SidebarNavItemClassPipe, SidebarNavLabelComponent, @@ -50,28 +41,22 @@ import { SidebarNavLinkContentComponent, SidebarNavLinkPipe, SidebarNavTitleComponent, - SidebarHeaderComponent, - SidebarFooterComponent, - ], - imports: [ - CommonModule, - RouterModule, - SharedModule, - IconModule + SidebarToggleDirective, + SidebarTogglerDirective ], exports: [ SidebarComponent, SidebarToggleDirective, - SidebarTogglerComponent, + SidebarTogglerDirective, SidebarBrandComponent, SidebarNavComponent, SidebarHeaderComponent, - SidebarFooterComponent, + SidebarFooterComponent ], providers: [ SidebarService, SidebarNavHelper, SidebarNavGroupService - ], + ] }) -export class SidebarModule { } +export class SidebarModule {} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar.service.ts b/projects/coreui-angular/src/lib/sidebar/sidebar.service.ts index f0fdb9f4..c0b41019 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar.service.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; -import {SidebarComponent} from './sidebar/sidebar.component'; +import { SidebarComponent } from './sidebar/sidebar.component'; export interface ISidebarAction { unfoldable?: boolean | 'toggle'; @@ -17,12 +17,9 @@ export interface ISidebarAction { providedIn: 'root' }) export class SidebarService { - private sidebarState = new BehaviorSubject({}); sidebarState$ = this.sidebarState.asObservable(); - constructor() {} - toggle(action: ISidebarAction): void { this.sidebarState.next(action); } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.spec.ts b/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.spec.ts index 1f932e20..63281cee 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.spec.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.spec.ts @@ -8,9 +8,9 @@ describe('SidebarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ SidebarComponent ] + imports: [SidebarComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('SidebarComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('sidebar-fixed'); + }); }); diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts index fb4d07ad..7c73d812 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts @@ -1,18 +1,20 @@ import { + booleanAttribute, Component, - EventEmitter, - HostBinding, - Inject, - Input, + computed, + effect, + inject, + input, + linkedSignal, OnChanges, OnDestroy, OnInit, - Output, + output, Renderer2, + signal, SimpleChanges } from '@angular/core'; import { DOCUMENT } from '@angular/common'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout'; import { Subscription } from 'rxjs'; @@ -22,151 +24,186 @@ import { SidebarBackdropService } from '../sidebar-backdrop/sidebar-backdrop.ser @Component({ selector: 'c-sidebar', exportAs: 'cSidebar', - template: '', + template: '', + host: { + class: 'sidebar', + '[class]': 'hostClasses()', + '[attr.inert]': '!this.sidebarState.visible || null' + } }) export class SidebarComponent implements OnChanges, OnDestroy, OnInit { + readonly #document = inject(DOCUMENT); + readonly #renderer = inject(Renderer2); + readonly #breakpointObserver = inject(BreakpointObserver); + readonly #sidebarService = inject(SidebarService); + readonly #backdropService = inject(SidebarBackdropService); - static ngAcceptInputType_narrow: BooleanInput; - static ngAcceptInputType_overlaid: BooleanInput; - static ngAcceptInputType_unfoldable: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; - - private _narrow = false; - private _overlaid = false; - private _unfoldable = false; - private _visible = false; - private onMobile = false; - private layoutChangeSubscription!: Subscription; - private stateToggleSubscription!: Subscription; + #onMobile = false; + #layoutChangeSubscription!: Subscription; + #stateToggleSubscription!: Subscription; - state: ISidebarAction = { + readonly state = signal({ sidebar: this + }); + + #stateInitial = { + narrow: false, + visible: false, + unfoldable: false }; /** - * Sets html attribute id. [docs] - * - * @type string + * Sets if the color of text should be colored for a light or dark background. + * @return 'dark' | 'light' */ - @Input() id?: string; + readonly colorScheme = input<'dark' | 'light'>(); /** - * Make sidebar narrow. [docs] - * @type boolean + * Sets html attribute id. + * @return string */ - @Input() - set narrow(value: boolean) { - this._narrow = coerceBooleanProperty(value); + readonly id = input(); + + /** + * Make sidebar narrow. + * @return boolean + * @default false + */ + readonly narrowInput = input(false, { transform: booleanAttribute, alias: 'narrow' }); + + readonly #narrow = linkedSignal(this.narrowInput); + + set narrow(value) { + this.#narrow.set(value); } + get narrow() { - return this._narrow; + return this.#narrow(); } /** * Set sidebar to overlaid variant. - * @type boolean + * @return boolean + * @default false */ - @Input() - set overlaid(value: boolean) { - this._overlaid = coerceBooleanProperty(value); - } - get overlaid() { - return this._overlaid; - } + readonly overlaid = input(false, { transform: booleanAttribute }); + + /** + * Components placement, there’s no default placement. + * @return 'start' | 'end' + */ + readonly placement = input<'start' | 'end'>(); /** - * Place sidebar in non-static positions. [docs] + * Place sidebar in non-static positions. + * @return 'fixed' | 'sticky' * @default 'fixed' */ - @Input() position: 'fixed' | 'sticky' = 'fixed'; + readonly position = input<'fixed' | 'sticky'>('fixed'); /** - * Size the component small, large, or extra large. [docs] + * Size the component small, large, or extra large. + * @return 'sm' | 'lg' | 'xl' */ - @Input() size?: 'sm' | 'lg' | 'xl'; + readonly size = input<'sm' | 'lg' | 'xl'>(); /** - * Expand narrowed sidebar on hover. [docs] + * Expand narrowed sidebar on hover. + * @type boolean + * @default false */ - @Input() - set unfoldable(value: boolean) { - this._unfoldable = coerceBooleanProperty(value); - } - get unfoldable() { - return this._unfoldable; - } + readonly unfoldableInput = input(false, { transform: booleanAttribute, alias: 'unfoldable' }); + + readonly unfoldable = linkedSignal({ + source: this.unfoldableInput, + computation: (value) => value + }); /** - * Toggle the visibility of sidebar component. [docs] + * Toggle the visibility of sidebar component. + * @type boolean + * @default false */ - @Input() + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); + + readonly #visible = linkedSignal(this.visibleInput); + + readonly #visibleEffect = effect(() => { + this.visibleChange.emit(this.#visible()); + }); + set visible(value: boolean) { - this._visible = coerceBooleanProperty(value); - this.visibleChange.emit(this._visible); + this.#visible.set(value); } + get visible() { - return this._visible; + return this.#visible(); } /** - * Event emitted on visibility change. [docs] - * @type boolean + * Event emitted on visibility change. + * @return boolean */ - @Output() visibleChange = new EventEmitter(); + readonly visibleChange = output(); set sidebarState(value: ISidebarAction) { const newState = value; if ('toggle' in newState) { if (newState.toggle === 'visible') { - newState.visible = !this.state.visible; - this.visible = newState.visible && !this.overlaid; + newState.visible = !this.state().visible; + this.#visible.set(newState.visible); } else if (newState.toggle === 'unfoldable') { - newState.unfoldable = !this.state.unfoldable; - this.unfoldable = newState.unfoldable; + newState.unfoldable = !this.state().unfoldable; + this.unfoldable.set(newState.unfoldable); } + } else { + this.#visible.update((visible) => (newState.visible ?? visible) && !this.overlaid()); } - this.state = { - ...this.state, - ...newState - }; - this.state.mobile && this.state.visible ? this.backdropService.setBackdrop(this) : this.backdropService.clearBackdrop(); + this.state.update((state) => ({ ...state, ...newState })); + this.state().mobile && this.state().visible + ? this.#backdropService.setBackdrop(this) + : this.#backdropService.clearBackdrop(); } get sidebarState(): ISidebarAction { - return this.state; + return { ...this.state() }; } get getMobileBreakpoint(): string { - const element = this.document.firstElementChild; - const mobileBreakpoint = getComputedStyle(element).getPropertyValue('--cui-mobile-breakpoint') || 'md'; - const breakpointValue = getComputedStyle(element).getPropertyValue(`--cui-breakpoint-${mobileBreakpoint.trim()}`) || '768px'; - return `${parseFloat(breakpointValue.trim()) - .02}px` || '767.98px'; + const element: Element = this.#document.documentElement; + const mobileBreakpoint = + this.#document.defaultView?.getComputedStyle(element)?.getPropertyValue('--cui-mobile-breakpoint') ?? 'md'; + const breakpointValue = + this.#document.defaultView + ?.getComputedStyle(element) + ?.getPropertyValue(`--cui-breakpoint-${mobileBreakpoint.trim()}`) ?? '768px'; + return `${parseFloat(breakpointValue.trim()) - 0.02}px`; } - constructor( - @Inject(DOCUMENT) private document: any, - private renderer: Renderer2, - private breakpointObserver: BreakpointObserver, - private sidebarService: SidebarService, - private backdropService: SidebarBackdropService - ) { - this.backdropService.renderer = renderer; + constructor() { + this.#backdropService.renderer = this.#renderer; } - @HostBinding('class') - get getClasses(): any { - const {mobile, unfoldable, visible} = this.sidebarState; + readonly hostClasses = computed(() => { + const { mobile, visible } = { ...this.sidebarState }; + const unfoldable = this.unfoldable(); + const placement = this.placement(); + const colorScheme = this.colorScheme(); + const size = this.size(); return { sidebar: true, - 'sidebar-fixed': this.position === 'fixed' && !mobile, - 'sidebar-narrow': this.narrow && !this.unfoldable, + 'sidebar-fixed': this.position() === 'fixed' && !mobile, + 'sidebar-narrow': this.#narrow() && !unfoldable, 'sidebar-narrow-unfoldable': unfoldable, - 'sidebar-overlaid': this.overlaid, - [`sidebar-${this.size}`]: !!this.size, - show: visible && this.onMobile, - hide: !visible && !this.onMobile + 'sidebar-overlaid': this.overlaid(), + [`sidebar-${placement}`]: !!placement, + [`sidebar-${colorScheme}`]: !!colorScheme, + [`sidebar-${size}`]: !!size, + show: visible, + // show: visible && this.#onMobile, //todo: check + hide: !visible }; - } + }); ngOnInit(): void { this.setInitialState(); @@ -180,7 +217,7 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { } ngOnChanges(changes: SimpleChanges): void { - const oldStateMap = new Map(Object.entries(this.state)); + const oldStateMap = new Map(Object.entries(this.state())); const newStateMap = new Map(); newStateMap.set('sidebar', this); @@ -189,7 +226,7 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { for (const propName in changes) { if (propList.includes(propName)) { if (changes[propName] && !changes[propName].firstChange) { - const value = coerceBooleanProperty(changes[propName].currentValue); + const value = booleanAttribute(changes[propName].currentValue); if (oldStateMap.get(propName) !== value) { newStateMap.set(propName, value); } @@ -199,28 +236,31 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { if (newStateMap.size > 1) { const state = Object.fromEntries(newStateMap.entries()); - this.sidebarService.toggle(state); + this.#sidebarService.toggle(state); } } setInitialState(): void { - this.sidebarService.toggle({ - narrow: this.narrow, - visible: this.visible, - unfoldable: this.unfoldable, + this.#stateInitial = { + narrow: this.#narrow(), + visible: this.#visible(), + unfoldable: this.unfoldable() + }; + this.#sidebarService.toggle({ + ...this.#stateInitial, sidebar: this }); } private stateToggleSubscribe(subscribe: boolean = true): void { if (subscribe) { - this.stateToggleSubscription = this.sidebarService.sidebarState$.subscribe((state) => { - if (this === state.sidebar || this.id === state.id) { - this.sidebarState = state; + this.#stateToggleSubscription = this.#sidebarService.sidebarState$.subscribe((state) => { + if (this === state.sidebar || this.id() === state.id) { + this.sidebarState = { ...state }; } }); } else { - this.stateToggleSubscription.unsubscribe(); + this.#stateToggleSubscription?.unsubscribe(); } } @@ -228,22 +268,23 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { const onMobile = `(max-width: ${this.getMobileBreakpoint})`; if (subscribe) { - const layoutChanges = this.breakpointObserver.observe([onMobile]); + const layoutChanges = this.#breakpointObserver.observe([onMobile]); - this.layoutChangeSubscription = layoutChanges.subscribe((result: BreakpointState) => { + this.#layoutChangeSubscription = layoutChanges.subscribe((result: BreakpointState) => { const isOnMobile = result.breakpoints[onMobile]; - if (this.onMobile !== isOnMobile) { - this.onMobile = isOnMobile; - this.sidebarService.toggle({ + const isUnfoldable = isOnMobile ? false : this.unfoldable(); + if (this.#onMobile !== isOnMobile) { + this.#onMobile = isOnMobile; + this.#sidebarService.toggle({ mobile: isOnMobile, - unfoldable: isOnMobile ? false : this.unfoldable, - visible: isOnMobile ? false : this.visible, + unfoldable: isUnfoldable, + visible: isOnMobile ? !isOnMobile : this.#stateInitial.visible, sidebar: this }); } }); } else { - this.layoutChangeSubscription.unsubscribe(); + this.#layoutChangeSubscription?.unsubscribe(); } } } diff --git a/projects/coreui-angular/src/lib/spinner/spinner.component.html b/projects/coreui-angular/src/lib/spinner/spinner.component.html index bcf7f99a..9cc351e5 100644 --- a/projects/coreui-angular/src/lib/spinner/spinner.component.html +++ b/projects/coreui-angular/src/lib/spinner/spinner.component.html @@ -1 +1,3 @@ -{{label}} + + {{ label() }} + diff --git a/projects/coreui-angular/src/lib/spinner/spinner.component.spec.ts b/projects/coreui-angular/src/lib/spinner/spinner.component.spec.ts index f80aad8f..43d9fff9 100644 --- a/projects/coreui-angular/src/lib/spinner/spinner.component.spec.ts +++ b/projects/coreui-angular/src/lib/spinner/spinner.component.spec.ts @@ -8,9 +8,9 @@ describe('SpinnerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ SpinnerComponent ] + imports: [SpinnerComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('SpinnerComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('spinner-border'); + }); }); diff --git a/projects/coreui-angular/src/lib/spinner/spinner.component.ts b/projects/coreui-angular/src/lib/spinner/spinner.component.ts index 9bf5657c..10df157c 100644 --- a/projects/coreui-angular/src/lib/spinner/spinner.component.ts +++ b/projects/coreui-angular/src/lib/spinner/spinner.component.ts @@ -1,48 +1,54 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, computed, input } from '@angular/core'; import { Colors } from '../coreui.types'; @Component({ selector: 'c-spinner', templateUrl: './spinner.component.html', + host: { + '[attr.role]': 'role()', + '[class]': 'hostClasses()' + } }) export class SpinnerComponent { /** * Sets the color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() color?: Colors; + readonly color = input(); /** * Label for accessibility. * @type string * @default 'Loading...' */ - @Input() label: string = "Loading..."; + readonly label = input('Loading...'); /** * Size the component small. * @type string * @values 'sm' */ - @Input() size?: 'sm'; + readonly size = input<'sm'>(); /** * Set the button variant to an outlined button or a ghost button. * @values 'border' | 'grow' * @default 'border' */ - @Input() variant?: 'border' | 'grow' = 'border'; - - @Input() - @HostBinding('attr.role') role = 'status'; + readonly variant = input<'border' | 'grow'>('border'); + /** + * Default role attr for Spinner. [docs] + * @type string + * @default 'status' + */ + readonly role = input('status'); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { return { - [`spinner-${this.variant}`]: true, - [`text-${this.color}`]: !!this.color, - [`spinner-${this.variant}-${this.size}`]: !!this.size - }; - } + [`spinner-${this.variant()}`]: true, + [`text-${this.color()}`]: !!this.color(), + [`spinner-${this.variant()}-${this.size()}`]: !!this.size() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/spinner/spinner.module.ts b/projects/coreui-angular/src/lib/spinner/spinner.module.ts index 62711164..4dceeaef 100644 --- a/projects/coreui-angular/src/lib/spinner/spinner.module.ts +++ b/projects/coreui-angular/src/lib/spinner/spinner.module.ts @@ -1,19 +1,13 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { SpinnerComponent } from './spinner.component'; -import {SharedModule} from '../shared'; @NgModule({ - declarations: [ - SpinnerComponent - ], exports: [ SpinnerComponent ], imports: [ - CommonModule, - SharedModule + SpinnerComponent ] }) -export class SpinnerModule { } +export class SpinnerModule {} diff --git a/projects/coreui-angular/src/lib/table/table-active.directive.spec.ts b/projects/coreui-angular/src/lib/table/table-active.directive.spec.ts index 244f205b..0dc9649f 100644 --- a/projects/coreui-angular/src/lib/table/table-active.directive.spec.ts +++ b/projects/coreui-angular/src/lib/table/table-active.directive.spec.ts @@ -1,8 +1,48 @@ +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; import { TableActiveDirective } from './table-active.directive'; +@Component({ + imports: [TableActiveDirective], + template: ` ` +}) +class TestComponent { + active = false; +} + describe('TableActiveDirective', () => { + let fixture: ComponentFixture; + let debugElement: DebugElement; + let directive: TableActiveDirective; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }); + fixture = TestBed.createComponent(TestComponent); + debugElement = fixture.debugElement.query(By.directive(TableActiveDirective)); + directive = debugElement.injector.get(TableActiveDirective); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new TableActiveDirective(); expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new TableActiveDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should add class "table-active" when active is true', () => { + fixture.componentInstance.active = true; + fixture.detectChanges(); + expect(debugElement.nativeElement.classList).toContain('table-active'); + }); + + it('should not add class "table-active" when active is false', () => { + fixture.componentInstance.active = false; + fixture.detectChanges(); + expect(debugElement.nativeElement.classList).not.toContain('table-active'); }); }); diff --git a/projects/coreui-angular/src/lib/table/table-active.directive.ts b/projects/coreui-angular/src/lib/table/table-active.directive.ts index 74e6803b..25397c75 100644 --- a/projects/coreui-angular/src/lib/table/table-active.directive.ts +++ b/projects/coreui-angular/src/lib/table/table-active.directive.ts @@ -1,34 +1,16 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Directive, input } from '@angular/core'; @Directive({ - selector: '[cTableActive]' + selector: '[cTableActive]', + exportAs: 'cTableActive', + host: { + '[class.table-active]': 'active()' + } }) export class TableActiveDirective { - - static ngAcceptInputType_active: BooleanInput; - /** * Highlight a table row or cell - * @type boolean + * @return boolean */ - @Input('cTableActive') - set active(value: boolean) { - this._active = coerceBooleanProperty(value); - }; - get active() { - return this._active; - }; - - private _active = false; - - @HostBinding('class') - get hostClasses(): any { - return { - 'table-active': this.active, - }; - } - - constructor() { } - + readonly active = input(false, { alias: "cTableActive", transform: booleanAttribute }); } diff --git a/projects/coreui-angular/src/lib/table/table-color.directive.spec.ts b/projects/coreui-angular/src/lib/table/table-color.directive.spec.ts index f2807dc1..ee2664b2 100644 --- a/projects/coreui-angular/src/lib/table/table-color.directive.spec.ts +++ b/projects/coreui-angular/src/lib/table/table-color.directive.spec.ts @@ -1,8 +1,11 @@ +import { TestBed } from '@angular/core/testing'; import { TableColorDirective } from './table-color.directive'; describe('TableColorDirective', () => { it('should create an instance', () => { - const directive = new TableColorDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new TableColorDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/table/table-color.directive.ts b/projects/coreui-angular/src/lib/table/table-color.directive.ts index 0e3392d7..6223252a 100644 --- a/projects/coreui-angular/src/lib/table/table-color.directive.ts +++ b/projects/coreui-angular/src/lib/table/table-color.directive.ts @@ -1,21 +1,24 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; import { Colors } from '../coreui.types'; @Directive({ - selector: '[cTableColor]' + selector: '[cTableColor]', + exportAs: 'cTableColor', + host: { + '[class]': 'hostClasses()' + } }) export class TableColorDirective { - /** * Use contextual color for tables, table rows or individual cells. - * @type Colors + * @return Colors */ - @Input('cTableColor') color?: Colors; + readonly color = input(undefined, { alias: 'cTableColor' }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const color = this.color(); return { - [`table-${this.color}`]: !!this.color, - }; - } + [`table-${color}`]: !!color + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/table/table.directive.spec.ts b/projects/coreui-angular/src/lib/table/table.directive.spec.ts index 0bf65e79..0d1fcaa2 100644 --- a/projects/coreui-angular/src/lib/table/table.directive.spec.ts +++ b/projects/coreui-angular/src/lib/table/table.directive.spec.ts @@ -1,21 +1,113 @@ -import { TestBed } from '@angular/core/testing'; -import { ElementRef, Renderer2 } from '@angular/core'; +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; import { TableDirective } from './table.directive'; +import { Colors } from '../coreui.types'; +import { TableActiveDirective } from './table-active.directive'; + +@Component({ + template: ` +
      + `, + imports: [TableDirective] +}) +class TestComponent { + align: 'bottom' | 'middle' | 'top' = 'middle'; + borderColor: Colors = 'primary'; + bordered: boolean = true; + borderless: boolean = false; + caption = 'top' as const; + color: Colors = 'secondary'; + hover: boolean = true; + small: boolean = true; + striped: boolean = true; + stripedColumns: boolean = true; +} + +class MockElementRef extends ElementRef {} describe('TableDirective', () => { - let renderer: Renderer2; - let hostElement: ElementRef; + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + let directive: TableDirective; beforeEach(() => { TestBed.configureTestingModule({ - imports: [Renderer2], - providers: [Renderer2] + imports: [TestComponent], + providers: [Renderer2, { provide: ElementRef, useClass: MockElementRef }] }); + fixture = TestBed.createComponent(TestComponent); + debugElement = fixture.debugElement.query(By.directive(TableDirective)); + directive = debugElement.injector.get(TableDirective); + component = fixture.componentInstance; + fixture.detectChanges(); }); it('should create an instance', () => { - const directive = new TableDirective(renderer, hostElement); expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new TableActiveDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should apply align input', () => { + expect(directive.align()).toBe('middle'); + }); + + it('should apply borderColor input', () => { + expect(directive.borderColor()).toBe('primary'); + }); + + it('should apply bordered input', () => { + expect(directive.bordered()).toBe(true); + }); + + it('should apply borderless input', () => { + expect(directive.borderless()).toBe(false); + }); + + it('should apply caption input', () => { + expect(directive.caption()).toBe('top'); + }); + + it('should apply color input', () => { + expect(directive.color()).toBe('secondary'); + }); + + it('should have responsive wrapper', () => { + const parentElement = debugElement.nativeElement.parentElement; + const classes = parentElement.classList; + expect(classes).toContain('table-responsive'); + }); + + it('should apply correct host classes', () => { + const classes = debugElement.nativeElement.classList; + + expect(classes).toContain('table'); + expect(classes).toContain('align-middle'); + expect(classes).toContain('caption-top'); + expect(classes).toContain('border-primary'); + expect(classes).toContain('table-bordered'); + expect(classes).toContain('table-secondary'); + expect(classes).toContain('table-hover'); + expect(classes).toContain('table-sm'); + expect(classes).toContain('table-striped'); + expect(classes).toContain('table-striped-columns'); }); }); diff --git a/projects/coreui-angular/src/lib/table/table.directive.ts b/projects/coreui-angular/src/lib/table/table.directive.ts index e8fe4240..13ed3a2f 100644 --- a/projects/coreui-angular/src/lib/table/table.directive.ts +++ b/projects/coreui-angular/src/lib/table/table.directive.ts @@ -1,177 +1,125 @@ -import { Directive, ElementRef, HostBinding, Input, OnInit, Renderer2 } from '@angular/core'; +import { booleanAttribute, computed, Directive, effect, ElementRef, inject, input, Renderer2 } from '@angular/core'; import { Breakpoints, Colors } from '../coreui.types'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; @Directive({ - selector: '[cTable]' + selector: 'table[cTable]', + exportAs: 'cTable', + host: { + class: 'table', + '[class]': 'hostClasses()' + } }) -export class TableDirective implements OnInit { - static ngAcceptInputType_bordered: BooleanInput; - static ngAcceptInputType_borderless: BooleanInput; - static ngAcceptInputType_hover: BooleanInput; - static ngAcceptInputType_small: BooleanInput; - static ngAcceptInputType_striped: BooleanInput; - static ngAcceptInputType_stripedColumns: BooleanInput; +export class TableDirective { + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); /** * Set the vertical alignment. - * @type string + * @return string * @values 'bottom' | 'middle' | 'top' */ - @Input() align?: 'bottom' | 'middle' | 'top'; + readonly align = input<'bottom' | 'middle' | 'top'>(); /** * Sets the border color of the component to one of CoreUI’s themed colors. - * @type Colors + * @return Colors */ - @Input() borderColor?: Colors; + readonly borderColor = input(); /** * Add borders on all sides of the table and cells. - * @type boolean + * @return boolean */ - @Input() - set bordered(value: boolean) { - this._bordered = coerceBooleanProperty(value); - }; - - get bordered() { - return this._bordered; - } - - private _bordered = false; + readonly bordered = input(false, { transform: booleanAttribute }); /** * Remove borders on all sides of the table and cells. - * @type boolean + * @return boolean */ - @Input() - set borderless(value: boolean) { - this._borderless = coerceBooleanProperty(value); - }; - - get borderless() { - return this._borderless; - } - - private _borderless = false; + readonly borderless = input(false, { transform: booleanAttribute }); /** * Put the `` on the top of the table. + * @return 'top' * @values 'top' */ - @Input() caption?: 'top'; + readonly caption = input<'top'>(); /** * Sets the color context of the component to one of CoreUI’s themed colors. - * @type Colors + * @return Colors */ - @Input() color?: Colors; + readonly color = input(); /** * Enable a hover state on table rows within table body. - * @type boolean + * @return boolean */ - @Input() - set hover(value: boolean) { - this._hover = coerceBooleanProperty(value); - }; - - get hover() { - return this._hover; - } - - private _hover = false; + readonly hover = input(false, { transform: booleanAttribute }); /** * Make table responsive across all viewports or pick a maximum breakpoint with which to have a responsive table up to. - * @type: {boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'} + * @values: {boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'} */ - @Input() responsive?: boolean | Omit; + readonly responsive = input>(); /** * Make table more compact by cutting all cell `padding` in half. - * @type boolean + * @return boolean */ - @Input() - set small(value: boolean) { - this._small = coerceBooleanProperty(value); - }; - - get small() { - return this._small; - } - - private _small = false; + readonly small = input(false, { transform: booleanAttribute }); /** * Add zebra-striping to any table row within the table body. - * @type boolean + * @return boolean */ - @Input() - set striped(value: boolean) { - this._striped = coerceBooleanProperty(value); - }; - - get striped() { - return this._striped; - } - - private _striped = false; + readonly striped = input(false, { transform: booleanAttribute }); /** * Add zebra-striping to any table column. - * @type boolean + * @return boolean * @since 4.2.4 */ - @Input() - set stripedColumns(value: boolean) { - this._stripedColumns = coerceBooleanProperty(value); - }; - - get stripedColumns() { - return this._stripedColumns; - } - - private _stripedColumns = false; + readonly stripedColumns = input(false, { transform: booleanAttribute }); + + readonly hostClasses = computed(() => { + const align = this.align(); + const caption = this.caption(); + const borderColor = this.borderColor(); + const bordered = this.bordered(); + const borderless = this.borderless(); + const color = this.color(); + const hover = this.hover(); + const small = this.small(); + const striped = this.striped(); + const stripedColumns = this.stripedColumns(); - constructor( - private renderer: Renderer2, - private hostElement: ElementRef - ) { } - - @HostBinding('class') - get hostClasses(): any { return { table: true, - [`align-${this.align}`]: !!this.align, - [`caption-${this.caption}`]: !!this.caption, - [`border-${this.borderColor}`]: !!this.borderColor, - 'table-bordered': this.bordered, - 'table-borderless': this.borderless, - [`table-${this.color}`]: !!this.color, - 'table-hover': this.hover, - 'table-sm': this.small, - 'table-striped': this.striped, - 'table-striped-columns': this.stripedColumns - }; - } - - ngOnInit(): void { - this.setResponsiveWrapper(); - } - - // todo - setResponsiveWrapper(): void { - if (!!this.responsive) { - const nativeElement: HTMLElement = this.hostElement.nativeElement; - const wrapper = this.renderer.createElement('div'); - const className = this.responsive === true ? 'table-responsive' : `table-responsive-${this.responsive}`; - this.renderer.addClass(wrapper, className); - const parentNode = this.renderer.parentNode(nativeElement); - this.renderer.appendChild(parentNode, wrapper); - this.renderer.insertBefore(parentNode, wrapper, nativeElement); - this.renderer.appendChild(wrapper, nativeElement); + [`align-${align}`]: !!align, + [`caption-${caption}`]: !!caption, + [`border-${borderColor}`]: !!borderColor, + 'table-bordered': bordered, + 'table-borderless': borderless, + [`table-${color}`]: !!color, + 'table-hover': hover, + 'table-sm': small, + 'table-striped': striped, + 'table-striped-columns': stripedColumns + } as Record; + }); + + readonly #responsiveWrapperEffect = effect(() => { + const responsive = this.responsive(); + if (!!responsive) { + const nativeElement: HTMLElement = this.#hostElement.nativeElement; + const wrapper = this.#renderer.createElement('div'); + const className = responsive === true ? 'table-responsive' : `table-responsive-${responsive}`; + this.#renderer.addClass(wrapper, className); + const parentNode = this.#renderer.parentNode(nativeElement); + this.#renderer.appendChild(parentNode, wrapper); + this.#renderer.insertBefore(parentNode, wrapper, nativeElement); + this.#renderer.appendChild(wrapper, nativeElement); } - } + }); } diff --git a/projects/coreui-angular/src/lib/table/table.module.ts b/projects/coreui-angular/src/lib/table/table.module.ts index d0e1a10d..3f39cd19 100644 --- a/projects/coreui-angular/src/lib/table/table.module.ts +++ b/projects/coreui-angular/src/lib/table/table.module.ts @@ -1,22 +1,18 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { TableDirective } from './table.directive'; import { TableColorDirective } from './table-color.directive'; import { TableActiveDirective } from './table-active.directive'; @NgModule({ - declarations: [ + exports: [ TableDirective, TableColorDirective, TableActiveDirective ], - exports: [ + imports: [ TableDirective, TableColorDirective, TableActiveDirective - ], - imports: [ - CommonModule ] }) -export class TableModule { } +export class TableModule {} diff --git a/projects/coreui-angular/src/lib/table/table.type.ts b/projects/coreui-angular/src/lib/table/table.type.ts new file mode 100644 index 00000000..60d5ae5f --- /dev/null +++ b/projects/coreui-angular/src/lib/table/table.type.ts @@ -0,0 +1,84 @@ +import { Breakpoints, Colors } from '../coreui.types'; + +export interface ITable { + /** + * Set the vertical alignment. + * @type string + * @values 'bottom' | 'middle' | 'top' + */ + align?: 'bottom' | 'middle' | 'top'; + /** + * Sets the border color of the component to one of CoreUI’s themed colors. + * @type Colors + */ + borderColor?: Colors; + /** + * Add borders on all sides of the table and cells. + * @type boolean + */ + bordered?: boolean | string; + /** + * Remove borders on all sides of the table and cells. + * @type boolean + */ + borderless?: boolean | string; + /** + * Put the `` on the top of the table. + * @values 'top' + */ + caption?: 'top'; + /** + * Sets the color context of the component to one of CoreUI’s themed colors. + * @type Colors + */ + color?: Colors; + /** + * Enable a hover state on table rows within table body. + * @type boolean + */ + hover?: boolean | string; + /** + * Make table responsive across all viewports or pick a maximum breakpoint with which to have a responsive table up to. + * @type: {boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'} + */ + responsive?: boolean | Omit; + /** + * Make table more compact by cutting all cell `padding` in half. + * @type boolean + */ + small?: boolean | string; + /** + * Add zebra-striping to any table row within the table body`. + * @type boolean + */ + striped?: boolean | string; + + attributes?: Partial; +} + +export interface ITableElementProps { + /** + * Set the vertical alignment. + @type 'bottom' | 'middle' | 'top' + */ + align?: ('bottom' | 'middle' | 'top'); + /** + * Sets the color context of the component to one of CoreUI’s themed colors. + * @type Colors + */ + color?: Colors; + + /** @deprecated */ + _attributes?: Partial; +} + +export interface ITableRowCellProps extends ITableElementProps { + /** + * Highlight a table row or cell + @type boolean + */ + active?: boolean; + + /** @deprecated */ + _attributes?: Partial | Partial; +} diff --git a/projects/coreui-angular/src/lib/tabs-2/index.ts b/projects/coreui-angular/src/lib/tabs-2/index.ts new file mode 100644 index 00000000..4aaf8f92 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/index.ts @@ -0,0 +1 @@ +export * from './public_api'; diff --git a/projects/coreui-angular/src/lib/tabs-2/public_api.ts b/projects/coreui-angular/src/lib/tabs-2/public_api.ts new file mode 100644 index 00000000..c89d3017 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/public_api.ts @@ -0,0 +1,7 @@ +export { Tabs2Module } from './tabs2.module'; +export { TabsComponent } from './tabs.component'; +export { TabsContentComponent } from './tabs-content/tabs-content.component'; +export { TabsListComponent } from './tabs-list/tabs-list.component'; +export { TabsService } from './tabs.service'; +export { TabDirective } from './tab/tab.directive'; +export { TabPanelComponent } from './tab-panel/tab-panel.component'; diff --git a/projects/coreui-angular/src/lib/tabs-2/tab-panel/tab-panel.component.spec.ts b/projects/coreui-angular/src/lib/tabs-2/tab-panel/tab-panel.component.spec.ts new file mode 100644 index 00000000..72d3fdd3 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tab-panel/tab-panel.component.spec.ts @@ -0,0 +1,44 @@ +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TabsComponent } from '../tabs.component'; +import { TabDirective } from '../tab/tab.directive'; +import { TabsContentComponent } from '../tabs-content/tabs-content.component'; +import { TabsListComponent } from '../tabs-list/tabs-list.component'; +import { TabPanelComponent } from './tab-panel.component'; + +@Component({ + template: ` + + + + + + + Tab panel 0 content + Tab panel 1 content + + + `, + imports: [TabPanelComponent, TabsComponent, TabDirective, TabsContentComponent, TabsListComponent] +}) +class TestComponent {} + +describe('TabPanelComponent', () => { + let component: TestComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + const fixture = TestBed.configureTestingModule({ + imports: [TestComponent, NoopAnimationsModule] + }).createComponent(TestComponent); + fixture.detectChanges(); + + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/tabs-2/tab-panel/tab-panel.component.ts b/projects/coreui-angular/src/lib/tabs-2/tab-panel/tab-panel.component.ts new file mode 100644 index 00000000..a3826cff --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tab-panel/tab-panel.component.ts @@ -0,0 +1,123 @@ +import { animate, animateChild, AnimationEvent, query, state, style, transition, trigger } from '@angular/animations'; +import { + Component, + computed, + HostBinding, + HostListener, + inject, + input, + InputSignal, + InputSignalWithTransform, + numberAttribute, + output, + OutputEmitterRef, + signal +} from '@angular/core'; +import { TabsService } from '../tabs.service'; + +type AnimateType = 'hide' | 'show'; +type VisibleChangeEvent = { itemKey: string | number; visible: boolean }; + +@Component({ + exportAs: 'cTabPanel', + selector: 'c-tab-panel', + template: '', + host: { + '[class]': 'hostClasses()', + '[tabindex]': 'visible() ? tabindex(): -1', + '[attr.aria-labelledby]': 'attrAriaLabelledBy()', + '[id]': 'propId()', + role: 'tabpanel' + }, + animations: [ + trigger('fadeInOut', [ + state('show', style({ opacity: 1 })), + state('hide', style({ opacity: 0 })), + state('void', style({ opacity: 1 })), + transition('* => *', [query('@*', [animateChild()], { optional: true }), animate('150ms linear')]) + ]) + ] +}) +export class TabPanelComponent { + readonly tabsService = inject(TabsService); + + /** + * aria-labelledby attribute + * @type string + * @default undefined + */ + readonly ariaLabelledBy: InputSignal = input(undefined, { + alias: 'aria-labelledby' + }); + + /** + * Element id attribute + * @type string + * @default undefined + */ + readonly id: InputSignal = input(); + + /** + * Item key. + * @type string | number + * @required + */ + readonly itemKey: InputSignal = input.required(); + + /** + * tabindex attribute. + * @type number + * @default 0 + */ + readonly tabindex: InputSignalWithTransform = input(0, { transform: numberAttribute }); + + /** + * Enable fade in transition. + * @type boolean + * @default true + */ + readonly transition: InputSignal = input(true); + + /** + * visible change output + * @type OutputEmitterRef + */ + readonly visibleChange: OutputEmitterRef = output(); + + readonly show = signal(false); + + readonly visible = computed(() => { + const visible = this.tabsService.activeItemKey() === this.itemKey() && !this.tabsService.activeItem()?.disabled; + this.visibleChange.emit({ itemKey: this.itemKey(), visible }); + return visible; + }); + + readonly propId = computed(() => this.id() ?? `${this.tabsService.id()}-panel-${this.itemKey()}`); + + readonly attrAriaLabelledBy = computed( + () => this.ariaLabelledBy() ?? `${this.tabsService.id()}-tab-${this.itemKey()}` + ); + + readonly hostClasses = computed(() => ({ + 'tab-pane': true, + active: this.show(), + fade: this.transition(), + show: this.show(), + invisible: this.tabsService.activeItem()?.disabled + }) as Record); + + @HostBinding('@.disabled') + get animationDisabled(): boolean { + return !this.transition(); + } + + @HostBinding('@fadeInOut') + get animateType(): AnimateType { + return this.visible() ? 'show' : 'hide'; + } + + @HostListener('@fadeInOut.done', ['$event']) + onAnimationDone($event: AnimationEvent): void { + this.show.set(this.visible()); + } +} diff --git a/projects/coreui-angular/src/lib/tabs-2/tab/tab.directive.spec.ts b/projects/coreui-angular/src/lib/tabs-2/tab/tab.directive.spec.ts new file mode 100644 index 00000000..37f93896 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tab/tab.directive.spec.ts @@ -0,0 +1,21 @@ +import { ElementRef } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { TabsService } from '../tabs.service'; +import { TabDirective } from './tab.directive'; + +class MockElementRef extends ElementRef {} + +describe('TabDirective', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [TabsService, { provide: ElementRef, useClass: MockElementRef }] + }); + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new TabDirective(); + expect(directive).toBeTruthy(); + }); + }); +}); diff --git a/projects/coreui-angular/src/lib/tabs-2/tab/tab.directive.ts b/projects/coreui-angular/src/lib/tabs-2/tab/tab.directive.ts new file mode 100644 index 00000000..67d2128e --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tab/tab.directive.ts @@ -0,0 +1,136 @@ +import { FocusableOption, FocusOrigin } from '@angular/cdk/a11y'; +import { + booleanAttribute, + computed, + DestroyRef, + Directive, + effect, + ElementRef, + inject, + Injector, + input, + InputSignal, + OnInit, + runInInjectionContext, + signal, + untracked +} from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { fromEvent, merge, takeWhile } from 'rxjs'; +import { filter, tap } from 'rxjs/operators'; +import { TabsService } from '../tabs.service'; + +@Directive({ + exportAs: 'cTab', + selector: 'button[cTab]', + host: { + '[class]': 'hostClasses()', + type: 'button', + role: 'tab', + '[attr.aria-selected]': 'isActive()', + '[attr.aria-controls]': 'attrAriaControls()', + '[attr.disabled]': 'attrDisabled() || null', + '[id]': 'propId()', + '[tabindex]': 'isActive() ? 0 : -1' + } +}) +export class TabDirective implements FocusableOption, OnInit { + readonly #injector = inject(Injector); + readonly #destroyRef = inject(DestroyRef); + readonly #elementRef = inject(ElementRef); + readonly #tabsService = inject(TabsService); + + /** + * Disabled attribute + * @return boolean + * @default false + */ + readonly disabledInput = input(false, { transform: booleanAttribute, alias: 'disabled' }); + + readonly #disabled = signal(false); + readonly attrDisabled = computed(() => this.#disabled() || null); + + readonly #disabledEffect = effect(() => { + const disabled = this.disabledInput(); + untracked(() => { + this.disabled = disabled; + }); + }); + + set disabled(value: boolean) { + this.#disabled.set(value); + } + + get disabled() { + return this.#disabled(); + } + + /** + * Item key. + * @type string | number + * @required + */ + readonly itemKey: InputSignal = input.required(); + + /** + * Element id attribute + * @type string + * @default undefined + */ + readonly id: InputSignal = input(); + + /** + * aria-controls attribute + * @type string + * @default undefined + */ + readonly ariaControls: InputSignal = input(undefined, { + alias: 'aria-controls' + }); + + readonly isActive = signal(false); + + readonly hostClasses = computed(() => ({ + 'nav-link': true, + active: this.isActive(), + disabled: this.#disabled() + }) as Record); + + readonly propId = computed(() => this.id() ?? `${this.#tabsService.id()}-tab-${this.itemKey()}`); + + readonly attrAriaControls = computed( + () => this.ariaControls() ?? `${this.#tabsService.id()}-panel-${this.itemKey()}` + ); + + readonly #disabledSignalEffect = effect(() => { + const disabled = this.#disabled(); + if (!disabled) { + const click$ = fromEvent(this.#elementRef.nativeElement, 'click'); + const focusIn$ = fromEvent(this.#elementRef.nativeElement, 'focusin'); + + merge(focusIn$, click$) + .pipe( + filter(($event) => !disabled), + tap(($event) => { + this.#tabsService.activeItemKey.set(untracked(this.itemKey)); + }), + takeWhile(() => !disabled), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(); + } + }); + + focus(origin?: FocusOrigin): void { + this.#elementRef.nativeElement.focus(); + } + + ngOnInit(): void { + runInInjectionContext(this.#injector, () => { + effect(() => { + const isActive = !this.#disabled() && this.#tabsService.activeItemKey() === this.itemKey(); + this.isActive.set(isActive); + }); + }); + } +} diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs-content/tabs-content.component.spec.ts b/projects/coreui-angular/src/lib/tabs-2/tabs-content/tabs-content.component.spec.ts new file mode 100644 index 00000000..8650d7e4 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs-content/tabs-content.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TabsContentComponent } from './tabs-content.component'; + +describe('TabsContentComponent', () => { + let component: TabsContentComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TabsContentComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TabsContentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs-content/tabs-content.component.ts b/projects/coreui-angular/src/lib/tabs-2/tabs-content/tabs-content.component.ts new file mode 100644 index 00000000..8bfe589f --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs-content/tabs-content.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + exportAs: 'cTabsContent', + selector: 'c-tabs-content', + template: '', + host: { + class: 'tab-content' + } +}) +export class TabsContentComponent {} diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs-list/tabs-list.component.spec.ts b/projects/coreui-angular/src/lib/tabs-2/tabs-list/tabs-list.component.spec.ts new file mode 100644 index 00000000..b8777568 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs-list/tabs-list.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TabsListComponent } from './tabs-list.component'; +import { TabsService } from '../tabs.service'; + +describe('TabsListComponent', () => { + let component: TabsListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TabsListComponent], + providers: [TabsService] + }).compileComponents(); + + fixture = TestBed.createComponent(TabsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs-list/tabs-list.component.ts b/projects/coreui-angular/src/lib/tabs-2/tabs-list/tabs-list.component.ts new file mode 100644 index 00000000..f0d47731 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs-list/tabs-list.component.ts @@ -0,0 +1,112 @@ +import { FocusKeyManager } from '@angular/cdk/a11y'; +import { + Component, + computed, + contentChildren, + DestroyRef, + effect, + HostListener, + inject, + input, + InputSignal, + untracked +} from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { tap } from 'rxjs/operators'; +import { TabDirective } from '../tab/tab.directive'; +import { TabsService } from '../tabs.service'; + +@Component({ + exportAs: 'cTabsList', + selector: 'c-tabs-list', + imports: [], + template: '', + host: { + '[attr.role]': 'role()', + '[class]': 'hostClasses()' + } +}) +export class TabsListComponent { + readonly #destroyRef = inject(DestroyRef); + readonly tabsService = inject(TabsService); + + /** + * Specify a layout type for component. + * @type 'fill' | 'justified' | undefined + * @default undefined + */ + readonly layout: InputSignal<'fill' | 'justified' | undefined> = input(); + + /** + * Set the variant to tabs, pills or underline. + * @type 'pills' | 'tabs' | 'underline' | 'underline-border' | undefined + * @default undefined + */ + readonly variant: InputSignal<'pills' | 'tabs' | 'underline' | 'underline-border' | undefined> = input(); + + /** + * Set the role to tab list. + * @default 'tablist' + */ + readonly role = input('tablist'); + + readonly hostClasses = computed(() => ({ + nav: true, + [`nav-${this.layout()}`]: this.layout(), + [`nav-${this.variant()}`]: this.variant() + }) as Record); + + readonly tabs = contentChildren(TabDirective); + #focusKeyManager!: FocusKeyManager; + + readonly #tabsEffect = effect(() => { + const tabs = this.tabs(); + if (tabs.length === 0) { + return; + } + this.#focusKeyManager = new FocusKeyManager(tabs) + .skipPredicate((tab) => tab.disabled === true) + .withHorizontalOrientation('ltr') + .withHomeAndEnd() + .withWrap(); + + this.#focusKeyManager.change + .pipe( + tap((value) => { + this.tabsService.activeItemKey.set(this.#focusKeyManager.activeItem?.itemKey()); + this.tabsService.activeItem.set(this.#focusKeyManager.activeItem); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(); + + untracked(() => { + setTimeout(() => { + const activeItem = tabs.find((tab) => tab.isActive()) ?? tabs.find((tab) => !tab.disabled); + const activeItemIndex = tabs.findIndex((tab) => tab === activeItem); + this.#focusKeyManager?.updateActiveItem(activeItemIndex < 0 ? 0 : activeItemIndex); + this.tabsService.activeItemKey.set(this.#focusKeyManager.activeItem?.itemKey()); + this.tabsService.activeItem.set(this.#focusKeyManager.activeItem); + }); + }); + }); + + readonly #tabsServiceEffect = effect(() => { + const activeItemIndex = this.tabs().findIndex( + (tab) => untracked(tab.isActive) && untracked(tab.itemKey) === this.tabsService.activeItemKey() + ); + this.#focusKeyManager?.updateActiveItem(activeItemIndex < 0 ? 0 : activeItemIndex); + }); + + @HostListener('keydown', ['$event']) + onKeydown($event: any) { + if (['ArrowLeft', 'ArrowRight'].includes($event.key)) { + this.#focusKeyManager.onKeydown($event); + return; + } + if (['Tab'].includes($event.key)) { + this.#focusKeyManager?.tabOut.next(); + } + return; + } +} diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs.component.scss b/projects/coreui-angular/src/lib/tabs-2/tabs.component.scss new file mode 100644 index 00000000..5d4e87f3 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs.component.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs.component.spec.ts b/projects/coreui-angular/src/lib/tabs-2/tabs.component.spec.ts new file mode 100644 index 00000000..91709791 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TabsComponent } from './tabs.component'; + +describe('TabsComponent', () => { + let component: TabsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TabsComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TabsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs.component.ts b/projects/coreui-angular/src/lib/tabs-2/tabs.component.ts new file mode 100644 index 00000000..bb501665 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs.component.ts @@ -0,0 +1,42 @@ +import { Component, effect, inject, input, model, ModelSignal } from '@angular/core'; +import { TabsService } from './tabs.service'; + +let nextId = 0; + +@Component({ + exportAs: 'cTabs', + selector: 'c-tabs', + imports: [], + template: '', + styleUrl: './tabs.component.scss', + providers: [TabsService], + host: { + '[id]': 'id()', + class: 'tabs' + } +}) +export class TabsComponent { + readonly tabsService = inject(TabsService); + + /** + * The active item key. + * @type + */ + readonly activeItemKey: ModelSignal = model(); + + /** + * The id attribute + * @type string + */ + tabsId = `tabs-${nextId++}`; + readonly id = input(this.tabsId); + + readonly #activeItemEffect = effect(() => { + this.tabsService.id.set(this.id()); + this.tabsService.activeItemKey.set(this.activeItemKey()); + }); + + readonly #tabsServiceEffect = effect(() => { + this.activeItemKey.set(this.tabsService.activeItemKey()); + }); +} diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs.service.spec.ts b/projects/coreui-angular/src/lib/tabs-2/tabs.service.spec.ts new file mode 100644 index 00000000..dd22bab7 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs.service.spec.ts @@ -0,0 +1,18 @@ +import { TestBed } from '@angular/core/testing'; + +import { TabsService } from './tabs.service'; + +describe('TabsService', () => { + let service: TabsService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [TabsService] + }); + service = TestBed.inject(TabsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs.service.ts b/projects/coreui-angular/src/lib/tabs-2/tabs.service.ts new file mode 100644 index 00000000..83916e87 --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs.service.ts @@ -0,0 +1,8 @@ +import { Injectable, signal } from '@angular/core'; + +@Injectable() +export class TabsService { + readonly activeItem = signal(undefined); + readonly activeItemKey = signal(undefined); + readonly id = signal(undefined); +} diff --git a/projects/coreui-angular/src/lib/tabs-2/tabs2.module.ts b/projects/coreui-angular/src/lib/tabs-2/tabs2.module.ts new file mode 100644 index 00000000..534e874d --- /dev/null +++ b/projects/coreui-angular/src/lib/tabs-2/tabs2.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { TabsService } from './tabs.service'; +import { TabsComponent } from './tabs.component'; +import { TabDirective } from './tab/tab.directive'; +import { TabsListComponent } from './tabs-list/tabs-list.component'; +import { TabsContentComponent } from './tabs-content/tabs-content.component'; +import { TabPanelComponent } from './tab-panel/tab-panel.component'; + +@NgModule({ + imports: [TabsComponent, TabsListComponent, TabDirective, TabsContentComponent, TabPanelComponent], + exports: [TabsComponent, TabsListComponent, TabDirective, TabsContentComponent, TabPanelComponent], + providers: [TabsService] +}) +export class Tabs2Module {} diff --git a/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.spec.ts b/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.spec.ts index 2f95f640..c10e66a8 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.spec.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.spec.ts @@ -1,12 +1,15 @@ import { TabContentRefDirective } from './tab-content-ref.directive'; -import { TabService } from './tab.service'; +import { TestBed } from '@angular/core/testing'; import { ChangeDetectorRef } from '@angular/core'; describe('TabContentRefDirective', () => { - let changeDetectorRef: ChangeDetectorRef; it('should create an instance', () => { - const tabService = new TabService(); - const directive = new TabContentRefDirective(changeDetectorRef, tabService); - expect(directive).toBeTruthy(); + TestBed.configureTestingModule({ + providers: [ChangeDetectorRef] + }); + TestBed.runInInjectionContext(() => { + const directive = new TabContentRefDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts b/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts index cc0f9813..95c51265 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts @@ -1,31 +1,32 @@ import { + booleanAttribute, ChangeDetectorRef, Directive, HostBinding, HostListener, + inject, Input, + numberAttribute, OnChanges, OnDestroy, - OnInit, SimpleChanges } from '@angular/core'; import { Subscription } from 'rxjs'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { TabService } from './tab.service'; @Directive({ - selector: '[cTabContent]', + selector: '[cTabContent]' }) -export class TabContentRefDirective implements OnChanges, OnDestroy, OnInit { +export class TabContentRefDirective implements OnChanges, OnDestroy { + readonly #changeDetectorRef = inject(ChangeDetectorRef); + readonly #tabService = inject(TabService); - constructor( - private changeDetectorRef: ChangeDetectorRef, - private tabService: TabService - ) { } + constructor() { + this.subscribeTabService(); + } - static ngAcceptInputType_disabled: BooleanInput; - private tabServiceSubscription!: Subscription; + #tabServiceSubscription!: Subscription; /** * Template Ref @@ -36,38 +37,43 @@ export class TabContentRefDirective implements OnChanges, OnDestroy, OnInit { /** * Set active state of tab content * @type boolean + * @default false */ - @Input() + @Input({ transform: booleanAttribute }) set active(value: boolean) { - const newValue = coerceBooleanProperty(value); - if (this._active !== newValue) { - this._active = newValue; - this.changeDetectorRef.detectChanges(); + const newValue = value; + if (this.#active !== newValue) { + this.#active = newValue; + this.#changeDetectorRef.detectChanges(); } } + get active() { - return this._active; + return this.#active; } - private _active = false; + + #active = false; /** * Set disabled state of tab content * @type boolean */ - @Input() + @Input({ transform: booleanAttribute }) set disabled(value: boolean) { - this._disabled = coerceBooleanProperty(value); + this.#disabled = value; } + get disabled(): boolean { - return this._disabled || this.tabPaneIdx >= this.tabContentRef?.panes?.length; + return this.#disabled || this.tabPaneIdx >= this.tabContentRef?.panes?.length; } - private _disabled = false; + + #disabled = false; /** * c-tab-pane index respectively * @type number */ - @Input() tabPaneIdx = -1; + @Input({ transform: numberAttribute }) tabPaneIdx = -1; @HostBinding('class') get hostClasses() { @@ -85,7 +91,16 @@ export class TabContentRefDirective implements OnChanges, OnDestroy, OnInit { @HostBinding('attr.disabled') get attrDisabled() { return this.disabled ? '' : null; - }; + } + + @HostBinding('attr.aria-selected') + private get ariaSelected() { + return this.active; + } + + @Input() + @HostBinding('attr.role') + role = 'tab'; @HostBinding('attr.tabindex') get getTabindex(): string | null { @@ -108,30 +123,26 @@ export class TabContentRefDirective implements OnChanges, OnDestroy, OnInit { setTimeout(() => { if (this.tabPaneIdx < this.tabContentRef.panes.length) { this.active = true; - this.tabService.setActiveTabIdx({ tabContent: this.tabContentRef, activeIdx: this.tabPaneIdx }); + this.#tabService.setActiveTabIdx({ tabContent: this.tabContentRef, activeIdx: this.tabPaneIdx }); } else { this.active = false; } }); } - ngOnInit(): void { - this.subscribeTabService(); - } - ngOnDestroy(): void { this.subscribeTabService(false); } subscribeTabService(subscribe: boolean = true) { if (subscribe) { - this.tabServiceSubscription = this.tabService.activeTabPaneIdx$.subscribe((tabContentState) => { + this.#tabServiceSubscription = this.#tabService.activeTabPaneIdx$.subscribe((tabContentState) => { if (tabContentState.tabContent === this.tabContentRef) { - this.active = (tabContentState.activeIdx === this.tabPaneIdx); + this.active = tabContentState.activeIdx === this.tabPaneIdx; } }); } else { - this.tabServiceSubscription.unsubscribe(); + this.#tabServiceSubscription?.unsubscribe(); } } } diff --git a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.html b/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.spec.ts b/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.spec.ts index 5fa43529..1352a201 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.spec.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.spec.ts @@ -8,9 +8,9 @@ describe('TabContentComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ TabContentComponent ] + imports: [TabContentComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,8 @@ describe('TabContentComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('tab-content'); + }); }); diff --git a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts b/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts index 51a1eda0..0f4b6df9 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts @@ -6,15 +6,15 @@ import { Component, ContentChildren, EventEmitter, - HostBinding, + inject, Input, + numberAttribute, OnChanges, OnDestroy, Output, QueryList, SimpleChanges } from '@angular/core'; -import { coerceNumberProperty } from '@angular/cdk/coercion'; import { Subscription } from 'rxjs'; import { TabPaneComponent } from '../tab-pane/tab-pane.component'; @@ -22,51 +22,44 @@ import { TabService } from '../tab.service'; @Component({ selector: 'c-tab-content', - templateUrl: './tab-content.component.html', + template: '', styleUrls: ['./tab-content.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - exportAs: 'cTabContent' + exportAs: 'cTabContent', + host: { class: 'tab-content' } }) export class TabContentComponent implements AfterContentChecked, AfterContentInit, OnChanges, OnDestroy { + readonly #changeDetectorRef = inject(ChangeDetectorRef); + readonly #tabService = inject(TabService); /** * Set active tabPane index * @type number */ - @Input() + @Input({ transform: numberAttribute }) set activeTabPaneIdx(value: number) { - const newValue = coerceNumberProperty(value); - if (this._activeTabPaneIdx != newValue) { - this._activeTabPaneIdx = newValue; + const newValue = value; + if (this.#activeTabPaneIdx != newValue) { + this.#activeTabPaneIdx = newValue; this.activeTabPaneIdxChange.emit(newValue); - this.changeDetectorRef.markForCheck(); - this.changeDetectorRef.detectChanges(); + this.#changeDetectorRef.markForCheck(); + this.#changeDetectorRef.detectChanges(); } - }; + } + get activeTabPaneIdx() { - return this._activeTabPaneIdx; + return this.#activeTabPaneIdx; } - private _activeTabPaneIdx = -1; + + #activeTabPaneIdx = -1; /** - * Event emited on the active tab pane index change. + * Event emitted on the active tab pane index change. */ @Output() activeTabPaneIdxChange: EventEmitter = new EventEmitter(); @ContentChildren(TabPaneComponent) public panes!: QueryList; - private tabServiceSubscription!: Subscription; - - constructor( - private changeDetectorRef: ChangeDetectorRef, - private tabService: TabService - ) { } - - @HostBinding('class') - get hostClasses() { - return { - 'tab-content': true - }; - } + #tabServiceSubscription!: Subscription; ngAfterContentInit(): void { this.subscribeTabService(); @@ -75,15 +68,15 @@ export class TabContentComponent implements AfterContentChecked, AfterContentIni ngAfterContentChecked(): void { this.panes?.forEach((tabPane, index) => { tabPane.tabContent = this; - tabPane.tabPaneIdx = index; + tabPane.tabPaneIdx = index; }); this.refreshTabPaneActive(this.activeTabPaneIdx); - this.tabService.setActiveTabIdx({ tabContent: this, activeIdx: this.activeTabPaneIdx }); + this.#tabService.setActiveTabIdx({ tabContent: this, activeIdx: this.activeTabPaneIdx }); } ngOnChanges(changes: SimpleChanges): void { if (changes['activeTabPaneIdx']?.currentValue) { - this.tabService.setActiveTabIdx({ tabContent: this, activeIdx: changes['activeTabPaneIdx'].currentValue }); + this.#tabService.setActiveTabIdx({ tabContent: this, activeIdx: changes['activeTabPaneIdx'].currentValue }); } } @@ -93,13 +86,13 @@ export class TabContentComponent implements AfterContentChecked, AfterContentIni subscribeTabService(subscribe: boolean = true) { if (subscribe) { - this.tabServiceSubscription = this.tabService.activeTabPaneIdx$.subscribe((tabContentState) => { + this.#tabServiceSubscription = this.#tabService.activeTabPaneIdx$.subscribe((tabContentState) => { if (this === tabContentState.tabContent) { this.activeTabPaneIdx = tabContentState.activeIdx; } }); } else { - this.tabServiceSubscription.unsubscribe(); + this.#tabServiceSubscription?.unsubscribe(); } } diff --git a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.html b/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.spec.ts b/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.spec.ts index 89797b71..51b92fb2 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.spec.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.spec.ts @@ -8,9 +8,9 @@ describe('TabPaneComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ TabPaneComponent ] + imports: [TabPaneComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,9 @@ describe('TabPaneComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('tab-pane'); + expect(fixture.nativeElement).toHaveClass('fade'); + }); }); diff --git a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts b/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts index a1af799a..62497581 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts @@ -1,38 +1,41 @@ -import { ChangeDetectorRef, Component, HostBinding, OnDestroy, OnInit } from '@angular/core'; +import { booleanAttribute, ChangeDetectorRef, Component, HostBinding, inject, Input, OnDestroy } from '@angular/core'; import { Subscription } from 'rxjs'; import { TabContentComponent } from '../tab-content/tab-content.component'; import { ITabContentState, TabService } from '../tab.service'; -import { coerceBooleanProperty } from '@angular/cdk/coercion'; @Component({ selector: 'c-tab-pane', - templateUrl: './tab-pane.component.html', + template: '', styleUrls: ['./tab-pane.component.scss'], - exportAs: 'cTabPane' + exportAs: 'cTabPane', + host: { class: 'tab-pane' } }) -export class TabPaneComponent implements OnDestroy, OnInit { +export class TabPaneComponent implements OnDestroy { + readonly #changeDetectorRef = inject(ChangeDetectorRef); + readonly #tabService = inject(TabService); - constructor( - private changeDetectorRef: ChangeDetectorRef, - private tabService: TabService - ) { } + constructor() { + this.subscribeTabService(); + } public tabPaneIdx!: number; public tabContent!: TabContentComponent; - private tabServiceSubscription!: Subscription; + #tabServiceSubscription!: Subscription; set active(value: boolean) { - const newValue = coerceBooleanProperty(value); - if (this._active !== newValue) { - this._active = newValue; - this.changeDetectorRef.markForCheck(); + const newValue = booleanAttribute(value); + if (this.#active !== newValue) { + this.#active = newValue; + this.#changeDetectorRef.markForCheck(); } } + get active(): boolean { - return this._active; + return this.#active; } - private _active: boolean = false; + + #active: boolean = false; @HostBinding('class') get hostClasses() { @@ -44,9 +47,9 @@ export class TabPaneComponent implements OnDestroy, OnInit { }; } - ngOnInit(): void { - this.subscribeTabService(); - } + @Input() + @HostBinding('attr.role') + role = 'tabpanel'; ngOnDestroy(): void { this.subscribeTabService(false); @@ -54,13 +57,15 @@ export class TabPaneComponent implements OnDestroy, OnInit { subscribeTabService(subscribe: boolean = true) { if (subscribe) { - this.tabServiceSubscription = this.tabService.activeTabPaneIdx$.subscribe((tabContentState: ITabContentState) => { - if (tabContentState.tabContent === this.tabContent) { - this.active = (tabContentState.activeIdx === this.tabPaneIdx); + this.#tabServiceSubscription = this.#tabService.activeTabPaneIdx$.subscribe( + (tabContentState: ITabContentState) => { + if (tabContentState.tabContent === this.tabContent) { + this.active = tabContentState.activeIdx === this.tabPaneIdx; + } } - }); + ); } else { - this.tabServiceSubscription.unsubscribe(); + this.#tabServiceSubscription?.unsubscribe(); } } } diff --git a/projects/coreui-angular/src/lib/tabs/tab.service.ts b/projects/coreui-angular/src/lib/tabs/tab.service.ts index 0a7aefad..ac54ef3e 100644 --- a/projects/coreui-angular/src/lib/tabs/tab.service.ts +++ b/projects/coreui-angular/src/lib/tabs/tab.service.ts @@ -3,20 +3,17 @@ import { Subject } from 'rxjs'; import { TabContentComponent } from './tab-content/tab-content.component'; export interface ITabContentState { - activeIdx: number, - tabContent: TabContentComponent + activeIdx: number; + tabContent: TabContentComponent; } @Injectable({ providedIn: 'root' }) export class TabService { - private activeTabPaneIdx = new Subject(); activeTabPaneIdx$ = this.activeTabPaneIdx.asObservable(); - constructor() { } - setActiveTabIdx(tabContentState: ITabContentState) { this.activeTabPaneIdx.next(tabContentState); } diff --git a/projects/coreui-angular/src/lib/tabs/tabs.module.ts b/projects/coreui-angular/src/lib/tabs/tabs.module.ts index 76e056aa..f0c7e7ff 100644 --- a/projects/coreui-angular/src/lib/tabs/tabs.module.ts +++ b/projects/coreui-angular/src/lib/tabs/tabs.module.ts @@ -1,18 +1,14 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { TabContentComponent } from './tab-content/tab-content.component'; import { TabPaneComponent } from './tab-pane/tab-pane.component'; import { TabService } from './tab.service'; import { TabContentRefDirective } from './tab-content-ref.directive'; @NgModule({ - declarations: [ - TabContentComponent, - TabPaneComponent, - TabContentRefDirective - ], imports: [ - CommonModule + TabContentComponent, + TabContentRefDirective, + TabPaneComponent ], exports: [ TabContentComponent, @@ -23,4 +19,4 @@ import { TabContentRefDirective } from './tab-content-ref.directive'; TabService ] }) -export class TabsModule { } +export class TabsModule {} diff --git a/projects/coreui-angular/src/lib/toast/public_api.ts b/projects/coreui-angular/src/lib/toast/public_api.ts index 6f166129..05241244 100644 --- a/projects/coreui-angular/src/lib/toast/public_api.ts +++ b/projects/coreui-angular/src/lib/toast/public_api.ts @@ -1,7 +1,7 @@ export { ToastComponent } from './toast/toast.component'; export { ToastBodyComponent } from './toast-body/toast-body.component'; export { ToastHeaderComponent } from './toast-header/toast-header.component'; -export { ToasterComponent, TToasterPlacement, ToasterPlacement } from './toaster/toaster.component'; +export { ToasterComponent, type TToasterPlacement, ToasterPlacement } from './toaster/toaster.component'; export { ToasterService } from './toaster/toaster.service'; export { ToasterHostDirective } from './toaster/toaster-host.directive'; export { ToastCloseDirective } from './toast-close.directive'; diff --git a/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.spec.ts b/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.spec.ts index 7185b744..c04a65ee 100644 --- a/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.spec.ts +++ b/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.spec.ts @@ -8,9 +8,9 @@ describe('ToastBodyComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ToastBodyComponent ] + imports: [ToastBodyComponent] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +22,8 @@ describe('ToastBodyComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('toast-body'); + }); }); diff --git a/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts b/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts index 0e2404b0..1e1f3166 100644 --- a/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts +++ b/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts @@ -1,18 +1,16 @@ -import { Component, HostBinding, Optional } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ToastComponent } from '../toast/toast.component'; @Component({ selector: 'c-toast-body', - template: '', + template: '', styleUrls: ['./toast-body.component.scss'], - exportAs: 'cToastBody' + exportAs: 'cToastBody', + host: { + class: 'toast-body', + } }) export class ToastBodyComponent { - - @HostBinding('class.toast-body') toastBodyClass = true; - - constructor( - @Optional() public toast?: ToastComponent - ) { } + readonly toast? = inject(ToastComponent, { optional: true }); } diff --git a/projects/coreui-angular/src/lib/toast/toast-close.directive.spec.ts b/projects/coreui-angular/src/lib/toast/toast-close.directive.spec.ts index 0fe99ef3..879ba91a 100644 --- a/projects/coreui-angular/src/lib/toast/toast-close.directive.spec.ts +++ b/projects/coreui-angular/src/lib/toast/toast-close.directive.spec.ts @@ -8,13 +8,13 @@ describe('ToastCloseDirective', () => { await TestBed.configureTestingModule({ providers: [ToasterService], imports: [ToastModule] - }) - .compileComponents(); + }).compileComponents(); }); it('should create an instance', () => { - const service = new ToasterService(); - const directive = new ToastCloseDirective(service); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ToastCloseDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/toast/toast-close.directive.ts b/projects/coreui-angular/src/lib/toast/toast-close.directive.ts index 61da8ceb..16ba62e6 100644 --- a/projects/coreui-angular/src/lib/toast/toast-close.directive.ts +++ b/projects/coreui-angular/src/lib/toast/toast-close.directive.ts @@ -1,20 +1,21 @@ -import { Directive, HostListener, Input } from '@angular/core'; +import { Directive, inject, input } from '@angular/core'; import { ToasterService } from './toaster/toaster.service'; +import type { ToastComponent } from './toast/toast.component'; @Directive({ selector: '[cToastClose]', - exportAs: 'cToastClose' + exportAs: 'cToastClose', + host: { + '(click)': 'toggleOpen($event)' + } }) export class ToastCloseDirective { + readonly #toasterService = inject(ToasterService); - @Input('cToastClose') toast: any; - - constructor(private toasterService: ToasterService) { } + readonly cToastClose = input(); - @HostListener('click', ['$event']) - toggleOpen($event: any): void { + toggleOpen($event: MouseEvent): void { $event.preventDefault(); - this.toasterService.setState({ show: false, toast: this.toast }); + this.#toasterService.setState({ show: false, toast: this.cToastClose() }); } - } diff --git a/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.html b/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.html index c49175ee..c18e0458 100644 --- a/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.html +++ b/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.html @@ -1,4 +1,6 @@ - - + + @if (closeButton()) { + + } diff --git a/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.scss b/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.spec.ts b/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.spec.ts index 4a1e65c1..cc1ae0a2 100644 --- a/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.spec.ts +++ b/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.spec.ts @@ -9,10 +9,9 @@ describe('ToastHeaderComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ToastHeaderComponent ], imports: [ToastModule] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -24,4 +23,8 @@ describe('ToastHeaderComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('toast-header'); + }); }); diff --git a/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.ts b/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.ts index afc7971b..6addf3a8 100644 --- a/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.ts +++ b/projects/coreui-angular/src/lib/toast/toast-header/toast-header.component.ts @@ -1,24 +1,26 @@ -import { Component, HostBinding, Input, Optional } from '@angular/core'; +import { Component, inject, input, signal } from '@angular/core'; + +import { ButtonCloseDirective } from '../../button'; import { ToastComponent } from '../toast/toast.component'; +import { ToastCloseDirective } from '../toast-close.directive'; @Component({ selector: 'c-toast-header', templateUrl: './toast-header.component.html', - styleUrls: ['./toast-header.component.scss'], - exportAs: 'cToastHeader' + exportAs: 'cToastHeader', + imports: [ToastCloseDirective, ButtonCloseDirective], + host: { + class: 'toast-header' + } }) export class ToastHeaderComponent { + readonly #toast = inject(ToastComponent, { optional: true }); + + readonly toast = signal(this.#toast ?? undefined); /** * Add close button to a toast header - * @type boolean + * @return boolean */ - @Input() closeButton = true; - - @HostBinding('class.toast-header') toastHeaderClass = true; - - constructor( - @Optional() public toast?: ToastComponent - ) { } - + readonly closeButton = input(true); } diff --git a/projects/coreui-angular/src/lib/toast/toast.module.ts b/projects/coreui-angular/src/lib/toast/toast.module.ts index 4d237747..7d49ac1b 100644 --- a/projects/coreui-angular/src/lib/toast/toast.module.ts +++ b/projects/coreui-angular/src/lib/toast/toast.module.ts @@ -1,7 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { ButtonModule } from '../button'; import { ToastComponent } from './toast/toast.component'; import { ToastHeaderComponent } from './toast-header/toast-header.component'; import { ToastBodyComponent } from './toast-body/toast-body.component'; @@ -11,23 +8,22 @@ import { ToasterHostDirective } from './toaster/toaster-host.directive'; import { ToastCloseDirective } from './toast-close.directive'; @NgModule({ - declarations: [ + imports: [ + ToastBodyComponent, ToastComponent, + ToastCloseDirective, ToastHeaderComponent, - ToastBodyComponent, ToasterComponent, - ToasterHostDirective, - ToastCloseDirective + ToasterHostDirective ], - imports: [CommonModule, ButtonModule], providers: [ToasterService], exports: [ + ToastBodyComponent, ToastComponent, + ToastCloseDirective, ToastHeaderComponent, - ToastBodyComponent, ToasterComponent, - ToasterHostDirective, - ToastCloseDirective + ToasterHostDirective ] }) export class ToastModule { diff --git a/projects/coreui-angular/src/lib/toast/toast/toast.component.html b/projects/coreui-angular/src/lib/toast/toast/toast.component.html deleted file mode 100644 index 6dbc7430..00000000 --- a/projects/coreui-angular/src/lib/toast/toast/toast.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/coreui-angular/src/lib/toast/toast/toast.component.spec.ts b/projects/coreui-angular/src/lib/toast/toast/toast.component.spec.ts index 5414d236..693727f7 100644 --- a/projects/coreui-angular/src/lib/toast/toast/toast.component.spec.ts +++ b/projects/coreui-angular/src/lib/toast/toast/toast.component.spec.ts @@ -10,10 +10,9 @@ describe('ToastComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [NoopAnimationsModule], - declarations: [ ToastComponent, ToastCloseDirective ] + imports: [NoopAnimationsModule, ToastComponent, ToastCloseDirective] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -25,4 +24,9 @@ describe('ToastComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('toast'); + expect(fixture.nativeElement).toHaveClass('show'); + }); }); diff --git a/projects/coreui-angular/src/lib/toast/toast/toast.component.ts b/projects/coreui-angular/src/lib/toast/toast/toast.component.ts index 2a6b0548..5d99dbd9 100644 --- a/projects/coreui-angular/src/lib/toast/toast/toast.component.ts +++ b/projects/coreui-angular/src/lib/toast/toast/toast.component.ts @@ -1,131 +1,143 @@ import { + booleanAttribute, ChangeDetectorRef, Component, + computed, + effect, ElementRef, - EventEmitter, - HostBinding, - HostListener, - Input, + inject, + input, + numberAttribute, OnDestroy, OnInit, - Output, - Renderer2, + output, + Renderer2 } from '@angular/core'; -import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { Colors } from '../../coreui.types'; import { ToasterService } from '../toaster/toaster.service'; import { TToasterPlacement } from '../toaster/toaster.component'; -import { Colors } from '../../coreui.types'; -type AnimateType = ('hide' | 'show'); +type AnimateType = 'hide' | 'show'; @Component({ selector: 'c-toast', - templateUrl: './toast.component.html', + template: '', styleUrls: ['./toast.component.scss'], exportAs: 'cToast', animations: [ trigger('fadeInOut', [ - state('show', style({opacity: 1, height: '*', padding: '*', border: '*', margin: '*'})), - state('hide', style({opacity: 0, height: 0, padding: 0, border: 0, margin: 0})), - state('void', style({opacity: 0, height: 0, padding: 0, border: 0, margin: 0})), - transition('show => hide', [ - animate('{{ time }} {{ easing }}'), - ], { - params: {time: '300ms', easing: 'ease-out'} + state('show', style({ opacity: 1, height: '*', padding: '*', border: '*', margin: '*' })), + state('hide', style({ opacity: 0, height: 0, padding: 0, border: 0, margin: 0 })), + state('void', style({ opacity: 0, height: 0, padding: 0, border: 0, margin: 0 })), + transition('show => hide', [animate('{{ time }} {{ easing }}')], { + params: { time: '300ms', easing: 'ease-out' } }), transition('hide => show', [animate('{{ time }} {{ easing }}')], { - params: {time: '300ms', easing: 'ease-in'}, + params: { time: '300ms', easing: 'ease-in' } }), transition('show => void', [animate('{{ time }} {{ easing }}')], { - params: {time: '300ms', easing: 'ease-out'}, + params: { time: '300ms', easing: 'ease-out' } }), transition('void => show', [animate('{{ time }} {{ easing }}')], { - params: {time: '300ms', easing: 'ease-in'}, - }), - ]), + params: { time: '300ms', easing: 'ease-in' } + }) + ]) ], + host: { + class: 'toast show', + '[class]': 'hostClasses()', + '(mouseover)': 'clearTimer()', + '(mouseout)': 'setTimer()', + '[@fadeInOut]': 'animateType', + '[@.disabled]': 'animationDisabled()' + } }) export class ToastComponent implements OnInit, OnDestroy { + readonly changeDetectorRef = inject(ChangeDetectorRef); + readonly hostElement = inject(ElementRef); + readonly renderer = inject(Renderer2); + readonly toasterService = inject(ToasterService); - static ngAcceptInputType_visible: BooleanInput; + readonly dynamic = input(); + readonly placementInput = input(undefined, { alias: 'placement' }); - public dynamic!: boolean; - public placement!: TToasterPlacement; - public hide!: boolean; + get placement() { + return this.placementInput(); + } /** * Auto hide the toast. - * @type boolean + * @return boolean */ - @Input() autohide = true; + readonly autohide = input(true); /** * Sets the color context of the component to one of CoreUI’s themed colors. - * @type Colors + * @return Colors */ - @Input() color?: Colors = ''; + readonly color = input(''); /** * Delay hiding the toast (ms). - * @type number + * @return number */ - @Input() delay = 5000; + readonly delay = input(5000, { transform: numberAttribute }); /** * Apply fade transition to the toast. - * @type boolean + * @return boolean */ - @Input() fade = true; + readonly fade = input(true); /** * Toggle the visibility of component. - * @type boolean + * @return boolean */ - @Input() + readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); + + readonly #visibleInputEffect = effect(() => { + this.visible = this.visibleInput(); + }); + set visible(value: boolean) { - const newValue = coerceBooleanProperty(value); - if (this._visible !== newValue) { - this._visible = newValue; + const newValue = value; + if (this.#visible !== newValue) { + this.#visible = newValue; newValue ? this.setTimer() : this.clearTimer(); this.visibleChange.emit(newValue); this.changeDetectorRef.markForCheck(); } } + get visible() { - return this._visible; + return this.#visible; } - private _visible = false; + + #visible = false; /** * @ignore */ - @Input() index?: number; + readonly index = input(0, { transform: numberAttribute }); /** * Event emitted on visibility change. [docs] - * @type boolean + * @return */ - @Output() visibleChange = new EventEmitter(); + readonly visibleChange = output(); /** * Event emitted on timer tick. [docs] - * @type number + * @return number */ - @Output() timer: EventEmitter = new EventEmitter(); + readonly timer = output(); - private timerId: any; - private clockId: any; - private clockTimerId: any; - - constructor( - public hostElement: ElementRef, - public renderer: Renderer2, - public toasterService: ToasterService, - public changeDetectorRef: ChangeDetectorRef - ) {} + private timerId: ReturnType | undefined; + private clockId: ReturnType | undefined; + private clockTimerId: ReturnType | undefined; private _clock!: number; @@ -139,51 +151,30 @@ export class ToastComponent implements OnInit, OnDestroy { this.changeDetectorRef.markForCheck(); } - @HostBinding('@.disabled') - get animationDisabled(): boolean { - return !this.fade; - } + readonly animationDisabled = computed(() => { + return !this.fade(); + }); - @HostBinding('@fadeInOut') get animateType(): AnimateType { return this.visible ? 'show' : 'hide'; } - @HostListener('@fadeInOut.start', ['$event']) - onAnimationStart($event: AnimationEvent): void { - this.onAnimationEvent($event); - } - - @HostListener('@fadeInOut.done', ['$event']) - onAnimationDone($event: AnimationEvent): void { - this.onAnimationEvent($event); - } - - @HostListener('mouseover') onMouseOver(): void { - this.clearTimer(); - } - - @HostListener('mouseout') onMouseOut(): void { - this.setTimer(); - } - - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const color = this.color(); return { toast: true, - fade: this.fade, - show: !this.hide, - [`bg-${this.color}`]: !!this.color, - 'border-0': !!this.color - }; - } + show: true, + [`bg-${color}`]: !!color, + 'border-0': !!color + } as Record; + }); ngOnInit(): void { if (this.visible) { this.toasterService.setState({ toast: this, show: this.visible, - placement: this.placement, + placement: this.placement }); this.clearTimer(); this.setTimer(); @@ -196,8 +187,8 @@ export class ToastComponent implements OnInit, OnDestroy { setTimer(): void { this.clearTimer(); - if (this.autohide && this.visible) { - this.timerId = this.delay > 0 ? setTimeout(() => this.onClose(), this.delay) : null; + if (this.autohide() && this.visible) { + this.timerId = this.delay() > 0 ? setTimeout(() => this.onClose(), this.delay()) : undefined; this.setClock(); } } @@ -205,7 +196,7 @@ export class ToastComponent implements OnInit, OnDestroy { clearTimer(): void { this.clearClock(); clearTimeout(this.timerId); - this.timerId = null; + this.timerId = undefined; } onClose(): void { @@ -213,7 +204,7 @@ export class ToastComponent implements OnInit, OnDestroy { this.toasterService.setState({ toast: this, show: false, - placement: this.placement, + placement: this.placement }); } @@ -226,22 +217,12 @@ export class ToastComponent implements OnInit, OnDestroy { }, 1000); this.clockTimerId = setTimeout(() => { this.clearClock(); - }, this.delay); + }, this.delay()); } clearClock(): void { clearTimeout(this.clockTimerId); clearInterval(this.clockId); - this.clockId = null; - } - - onAnimationEvent(event: AnimationEvent): void { - this.hide = event.phaseName === 'start' && event.toState === 'show'; - if (event.phaseName === 'done') { - this.hide = (event.toState === 'hide' || event.toState === 'void'); - if (event.toState === 'show') { - this.hide = false; - } - } + this.clockId = undefined; } } diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.spec.ts b/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.spec.ts index 47ba030a..b74019e3 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.spec.ts +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.spec.ts @@ -1,28 +1,30 @@ -import { Component, Renderer2, Type, ViewContainerRef } from '@angular/core'; +import { Component, ViewContainerRef } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ToasterHostDirective } from './toaster-host.directive'; @Component({ - template: `
      ` + template: `
      `, + imports: [ToasterHostDirective] }) class TestComponent {} describe('ToasterHostDirective', () => { let component: TestComponent; let fixture: ComponentFixture; - let containerRef: ViewContainerRef; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [TestComponent, ToasterHostDirective] + imports: [TestComponent, ToasterHostDirective], + providers: [ViewContainerRef] }); fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; }); - it('should create an instance', () => { - const directive = new ToasterHostDirective(containerRef); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new ToasterHostDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.ts b/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.ts index 8f3d6132..a28e0439 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.ts +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster-host.directive.ts @@ -1,12 +1,9 @@ -import { Directive, ViewContainerRef } from '@angular/core'; +import { Directive, inject, ViewContainerRef } from '@angular/core'; @Directive({ selector: '[cToasterHost]', exportAs: 'cToasterHost' }) export class ToasterHostDirective { - - constructor( - public viewContainerRef: ViewContainerRef - ) { } + readonly viewContainerRef = inject(ViewContainerRef); } diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html index 30f07ef9..252bfa13 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html @@ -1,2 +1,2 @@ - - + + diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.spec.ts b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.spec.ts index 4f8caa71..76a044cc 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.spec.ts +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.spec.ts @@ -9,9 +9,9 @@ describe('ToasterComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ToasterComponent, ToasterHostDirective ] + imports: [ToasterComponent, ToasterHostDirective] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -23,4 +23,9 @@ describe('ToasterComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('toaster'); + expect(fixture.nativeElement).toHaveClass('toast-container'); + }); }); diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts index e7a76adb..5b902bed 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts @@ -1,23 +1,20 @@ import { - AfterContentChecked, Component, - ComponentFactoryResolver, ComponentRef, - ContentChildren, + computed, + contentChildren, + DestroyRef, ElementRef, - HostBinding, + inject, Injector, - Input, + input, NgModuleRef, - OnDestroy, OnInit, - QueryList, Renderer2, - VERSION, - ViewChild, + viewChild, ViewContainerRef } from '@angular/core'; -import { Subscription } from 'rxjs'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { IToasterAction, ToasterService } from './toaster.service'; import { ToasterHostDirective } from './toaster-host.directive'; @@ -33,7 +30,7 @@ export enum ToasterPlacement { MiddleEnd = 'middle-end', BottomStart = 'bottom-start', BottomCenter = 'bottom-center', - BottomEnd = 'bottom-end', + BottomEnd = 'bottom-end' } export type TToasterPlacement = @@ -52,122 +49,114 @@ export type TToasterPlacement = @Component({ selector: 'c-toaster', templateUrl: './toaster.component.html', - exportAs: 'cToaster' + exportAs: 'cToaster', + imports: [ToasterHostDirective], + host: { + class: 'toaster toast-container', + '[class]': 'hostClasses()' + } }) -export class ToasterComponent implements OnDestroy, OnInit, AfterContentChecked { +export class ToasterComponent implements OnInit { + readonly #hostElement = inject(ElementRef); + readonly #renderer = inject(Renderer2); + readonly #toasterService = inject(ToasterService); + readonly #destroyRef = inject(DestroyRef); - stateToasterSubscription!: Subscription; placements = Object.values(ToasterPlacement); - toasts!: QueryList; - toastsDynamic: any[] = []; + toastsDynamic: ComponentRef[] = []; /** * Toaster placement - * @type TToasterPlacement + * @return TToasterPlacement */ - @Input() placement: TToasterPlacement = ToasterPlacement.TopEnd; + readonly placementInput = input(ToasterPlacement.TopEnd, { alias: 'placement' }); + + get placement() { + return this.placementInput(); + } /** * Toaster position - * @type (string | 'absolute' | 'fixed' | 'static') + * @return (string | 'absolute' | 'fixed' | 'static') */ - @Input() position: (string | 'absolute' | 'fixed' | 'static') = 'absolute'; - - @ViewChild(ToasterHostDirective, {static: true}) toasterHost!: ToasterHostDirective; - @ContentChildren(ToastComponent, {read: ViewContainerRef}) contentToasts!: QueryList; + readonly position = input('absolute'); - constructor( - private componentFactoryResolver: ComponentFactoryResolver, - private hostElement: ElementRef, - private renderer: Renderer2, - private toasterService: ToasterService - ) { } + readonly toasterHost = viewChild.required(ToasterHostDirective); + readonly contentToasts = contentChildren(ToastComponent, { read: ViewContainerRef }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const placement = this.placement; + const position = this.position(); return { toaster: true, 'toast-container': true, - [`position-${this.position}`]: !!this.position, - 'top-0': this.placement.includes('top'), - 'top-50': this.placement.includes('middle'), - 'bottom-0': this.placement.includes('bottom'), - 'start-0': this.placement.includes('start'), - 'start-50': this.placement.includes('center'), - 'end-0': this.placement.includes('end'), - 'translate-middle-x': this.placement.includes('center') && !this.placement.includes('middle'), - 'translate-middle-y': this.placement.includes('middle') && !this.placement.includes('center'), - 'translate-middle': this.placement.includes('middle') && this.placement.includes('center'), - }; - } + [`position-${position}`]: !!position, + 'top-0': placement.includes('top'), + 'top-50': placement.includes('middle'), + 'bottom-0': placement.includes('bottom'), + 'start-0': placement.includes('start'), + 'start-50': placement.includes('center'), + 'end-0': placement.includes('end'), + 'translate-middle-x': placement.includes('center') && !placement.includes('middle'), + 'translate-middle-y': placement.includes('middle') && !placement.includes('center'), + 'translate-middle': placement.includes('middle') && placement.includes('center') + } as Record; + }); ngOnInit(): void { - this.stateToasterSubscribe(true); - } - - ngOnDestroy(): void { - this.stateToasterSubscribe(false); + this.stateToasterSubscribe(); } - ngAfterContentChecked(): void { - this.toasts = this.contentToasts; - } - - addToast(toast: any, props: any, options?: { index?: number; injector?: Injector; ngModuleRef?: NgModuleRef; projectableNodes?: Node[][]; }): ComponentRef { - let componentRef: ComponentRef; - if (parseInt(VERSION.major) < 13) { - const factory = this.componentFactoryResolver.resolveComponentFactory(toast); - componentRef = this.toasterHost.viewContainerRef.createComponent(factory, options?.index, options?.injector, options?.projectableNodes, options?.ngModuleRef); - } else { - // @ts-ignore - componentRef = this.toasterHost.viewContainerRef.createComponent(toast, options); + public addToast( + toast: any, + props: any, + options?: { + index?: number; + injector?: Injector; + ngModuleRef?: NgModuleRef; + projectableNodes?: Node[][]; } + ): ComponentRef { + const componentRef: ComponentRef = this.toasterHost().viewContainerRef.createComponent(toast, options); this.toastsDynamic.push(componentRef); const index = this.toastsDynamic.indexOf(componentRef); for (const [key, value] of Object.entries(props)) { - componentRef.instance[key] = value; + componentRef.setInput(key, value); } - componentRef.instance['placement'] = this.placement; - componentRef.instance['dynamic'] = true; - componentRef.instance['index'] = index; - componentRef.instance['visible'] = true; + componentRef.setInput('placement', this.placement); + componentRef.setInput('dynamic', true); + componentRef.setInput('index', index); + componentRef.setInput('visible', true); componentRef.instance['visibleChange'].emit(true); componentRef.changeDetectorRef?.detectChanges(); return componentRef; } - removeToast(state: IToasterAction): void { - this.toastsDynamic?.forEach(item => { - if (state.toast?.dynamic && (item.instance === state.toast)) { - item.instance.visible = false; + public removeToast(state: IToasterAction): void { + this.toastsDynamic?.forEach((item) => { + if (state.toast?.dynamic() && item.instance === state.toast) { + item.setInput('visible', false); item.instance['visibleChange'].emit(false); - setTimeout(() => { - item.destroy(); - }, 300); + item.destroy(); } }); - - this.toasts?.forEach(item => { - if (item.element.nativeElement === state.toast?.hostElement.nativeElement) { - if (!state.toast?.dynamic) { - // @ts-ignore - state.toast.visible = false; + this.contentToasts()?.forEach((item) => { + if (state.toast && item.element.nativeElement === state.toast.hostElement.nativeElement) { + if (!state.toast.dynamic()) { + state.toast['visible'] = false; } } }); } - private stateToasterSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.stateToasterSubscription = this.toasterService.toasterState$.subscribe((state) => { - if (state.show === false) { - this.removeToast(state); - } - if (state.show === true && state.toast?.dynamic === undefined) { - } - }); - } else { - this.stateToasterSubscription.unsubscribe(); - } + private stateToasterSubscribe(): void { + this.#toasterService.toasterState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((state) => { + if (state.show === false) { + this.removeToast(state); + } + // if (state.show === true && state.toast?.dynamic() === undefined) { + // /* empty */ + // } + }); } } diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster.service.ts b/projects/coreui-angular/src/lib/toast/toaster/toaster.service.ts index ff4de885..ba21f320 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster.service.ts +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { TToasterPlacement } from './toaster.component'; -import { ToastComponent } from '../toast/toast.component'; +import { type ToastComponent } from '../toast/toast.component'; export interface IToasterAction { placement?: TToasterPlacement; @@ -14,13 +14,10 @@ export interface IToasterAction { providedIn: 'root' }) export class ToasterService { - - private toasterState = new BehaviorSubject({}); - toasterState$ = this.toasterState.asObservable(); - - constructor() {} + readonly #toasterState = new BehaviorSubject({}); + readonly toasterState$ = this.#toasterState.asObservable(); setState(state: IToasterAction): void { - this.toasterState.next({ ...state }); + this.#toasterState.next({ ...state }); } } diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip.directive.spec.ts b/projects/coreui-angular/src/lib/tooltip/tooltip.directive.spec.ts index a24777d9..4a826ac1 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip.directive.spec.ts +++ b/projects/coreui-angular/src/lib/tooltip/tooltip.directive.spec.ts @@ -1,17 +1,97 @@ -import { ChangeDetectorRef, ElementRef, Renderer2, ViewContainerRef } from '@angular/core'; -import { ListenersService } from '../services/listeners.service'; +import { DOCUMENT } from '@angular/common'; +import { + ChangeDetectorRef, + Component, + ComponentRef, + DebugElement, + ElementRef, + Renderer2, + ViewContainerRef +} from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; import { TooltipDirective } from './tooltip.directive'; +import { Triggers } from '../coreui.types'; +import { ListenersService } from '../services'; + +@Component({ + template: '', + imports: [TooltipDirective] +}) +export class TestComponent { + content = 'Test'; + visible = false; + trigger: Triggers[] = ['hover', 'click']; +} + +class MockElementRef extends ElementRef {} describe('TooltipDirective', () => { + let component: TestComponent; + let componentRef: ComponentRef; + let fixture: ComponentFixture; + let debugElement: DebugElement; let document: Document; - let renderer: Renderer2; - let hostElement: ElementRef; - let viewContainerRef: ViewContainerRef; - let changeDetectorRef: ChangeDetectorRef; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [ + // IntersectionService, + Renderer2, + ListenersService, + { provide: ElementRef, useClass: MockElementRef }, + ViewContainerRef, + ChangeDetectorRef + ] + }).compileComponents(); + document = TestBed.inject(DOCUMENT); + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(TooltipDirective)); + fixture.autoDetectChanges(); + }); it('should create an instance', () => { - const listenersService = new ListenersService(renderer); - const directive = new TooltipDirective(document, renderer, hostElement, viewContainerRef, listenersService, changeDetectorRef); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new TooltipDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('should have css classes', fakeAsync(() => { + expect(document.querySelector('.tooltip.show')).toBeNull(); + component.visible = true; + fixture.detectChanges(); + tick(500); + expect(document.querySelector('.tooltip.show')).toBeTruthy(); + component.visible = false; + fixture.detectChanges(); + tick(500); + expect(document.querySelector('.tooltip.show')).toBeNull(); + })); + + it('should set popover on and off', fakeAsync(() => { + fixture.autoDetectChanges(); + component.visible = false; + expect(document.querySelector('.tooltip.show')).toBeNull(); + debugElement.nativeElement.dispatchEvent(new Event('mouseenter')); + tick(500); + expect(document.querySelector('.tooltip.show')).toBeTruthy(); + debugElement.nativeElement.dispatchEvent(new Event('mouseleave')); + tick(500); + expect(document.querySelector('.tooltip.show')).toBeNull(); + })); + + it('should toggle popover', fakeAsync(() => { + fixture.autoDetectChanges(); + component.visible = false; + expect(document.querySelector('.tooltip.show')).toBeNull(); + debugElement.nativeElement.dispatchEvent(new Event('click')); + tick(500); + expect(document.querySelector('.tooltip.show')).toBeTruthy(); + debugElement.nativeElement.dispatchEvent(new Event('click')); + tick(500); + expect(document.querySelector('.tooltip.show')).toBeNull(); + })); }); diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts b/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts index 8bc7f2c5..baa4672d 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts +++ b/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts @@ -1,77 +1,110 @@ +import { DOCUMENT } from '@angular/common'; import { + AfterViewInit, ChangeDetectorRef, ComponentRef, + computed, + DestroyRef, Directive, + effect, ElementRef, - HostBinding, - Inject, - Input, - OnChanges, + inject, + input, + model, OnDestroy, OnInit, Renderer2, - SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core'; -import { DOCUMENT } from '@angular/common'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { debounceTime, filter, finalize } from 'rxjs/operators'; import { createPopper, Instance, Options } from '@popperjs/core'; import { Triggers } from '../coreui.types'; +import { IListenersConfig, IntersectionService, ListenersService } from '../services'; +import { ElementRefDirective } from '../shared'; import { TooltipComponent } from './tooltip/tooltip.component'; -import { IListenersConfig, ListenersService } from '../services/listeners.service'; @Directive({ selector: '[cTooltip]', exportAs: 'cTooltip', - providers: [ListenersService] + providers: [ListenersService, IntersectionService], + host: { '[attr.aria-describedby]': 'ariaDescribedBy' } }) -export class TooltipDirective implements OnChanges, OnDestroy, OnInit { +export class TooltipDirective implements OnDestroy, OnInit, AfterViewInit { + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + readonly #viewContainerRef = inject(ViewContainerRef); + readonly #listenersService = inject(ListenersService); + readonly #changeDetectorRef = inject(ChangeDetectorRef); + readonly #intersectionService = inject(IntersectionService); + readonly #destroyRef = inject(DestroyRef); + readonly #document = inject(DOCUMENT); /** * Content of tooltip - * @type {string | TemplateRef} + * @return {string | TemplateRef} */ - @Input('cTooltip') content: string | TemplateRef = ''; + readonly content = input | undefined>(undefined, { alias: 'cTooltip' }); + + readonly #contentEffect = effect(() => { + if (this.content()) { + this.destroyTooltipElement(); + } + }); /** * Optional popper Options object, takes precedence over cPopoverPlacement prop - * @type Partial + * @return Partial */ - @Input('cTooltipOptions') - set popperOptions(value: Partial) { - this._popperOptions = { ...this._popperOptions, placement: this.placement, ...value }; - }; + readonly popperOptions = input>({}, { alias: 'cTooltipOptions' }); - get popperOptions(): Partial { - return { placement: this.placement, ...this._popperOptions }; - } + readonly #popperOptionsEffect = effect(() => { + this._popperOptions = { + ...this._popperOptions, + placement: this.placement(), + ...this.popperOptions() + }; + }); + + readonly popperOptionsComputed = computed(() => { + return { placement: this.placement(), ...this._popperOptions }; + }); /** * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property. + * @return: 'top' | 'bottom' | 'left' | 'right' + * @default: 'top' + */ + readonly placement = input<'top' | 'bottom' | 'left' | 'right'>('top', { alias: 'cTooltipPlacement' }); + + /** + * ElementRefDirective for positioning the tooltip on reference element + * @return: ElementRefDirective + * @default: undefined */ - @Input('cTooltipPlacement') placement: 'top' | 'bottom' | 'left' | 'right' = 'top'; + readonly reference = input(undefined, { alias: 'cTooltipRef' }); + + readonly referenceRef = computed(() => this.reference()?.elementRef ?? this.#hostElement); + /** * Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them. - * @type {'hover' | 'focus' | 'click'} + * @return: 'Triggers | Triggers[] */ - @Input('cTooltipTrigger') trigger: Triggers | Triggers[] = 'hover'; + readonly trigger = input('hover', { alias: 'cTooltipTrigger' }); /** * Toggle the visibility of tooltip component. + * @return boolean */ - @Input('cTooltipVisible') - set visible(value: boolean) { - this._visible = value; - } - - get visible() { - return this._visible; - } + readonly visible = model(false, { alias: 'cTooltipVisible' }); - private _visible = false; + readonly #visibleEffect = effect(() => { + this.visible() ? this.addTooltipElement() : this.removeTooltipElement(); + }); - @HostBinding('attr.aria-describedby') get ariaDescribedBy(): string | null { + get ariaDescribedBy(): string | null { return this.tooltipId ? this.tooltipId : null; } @@ -85,25 +118,14 @@ export class TooltipDirective implements OnChanges, OnDestroy, OnInit { { name: 'offset', options: { - offset: [0, 0] + offset: [0, 5] } } ] }; - constructor( - @Inject(DOCUMENT) private document: Document, - private renderer: Renderer2, - private hostElement: ElementRef, - private viewContainerRef: ViewContainerRef, - private listenersService: ListenersService, - private changeDetectorRef: ChangeDetectorRef - ) {} - - ngOnChanges(changes: SimpleChanges): void { - if (changes['visible']) { - changes['visible'].currentValue ? this.addTooltipElement() : this.removeTooltipElement(); - } + ngAfterViewInit(): void { + this.intersectionServiceSubscribe(); } ngOnDestroy(): void { @@ -117,40 +139,53 @@ export class TooltipDirective implements OnChanges, OnDestroy, OnInit { private setListeners(): void { const config: IListenersConfig = { - hostElement: this.hostElement, - trigger: this.trigger, + hostElement: this.#hostElement, + trigger: this.trigger(), callbackToggle: () => { - this.visible = !this.visible; - this.visible ? this.addTooltipElement() : this.removeTooltipElement(); + this.visible.update((value) => !value); }, callbackOff: () => { - this.visible = false; - this.removeTooltipElement(); + this.visible.set(false); }, callbackOn: () => { - this.visible = true; - this.addTooltipElement(); + this.visible.set(true); } }; - this.listenersService.setListeners(config); + this.#listenersService.setListeners(config); } private clearListeners(): void { - this.listenersService.clearListeners(); + this.#listenersService.clearListeners(); + } + + private intersectionServiceSubscribe(): void { + this.#intersectionService.createIntersectionObserver(this.referenceRef()); + this.#intersectionService.intersecting$ + .pipe( + filter((next) => next.hostElement === this.referenceRef()), + debounceTime(100), + finalize(() => { + this.#intersectionService.unobserve(this.referenceRef()); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe((next) => { + this.visible.set(next.isIntersecting ? this.visible() : false); + }); } private getUID(prefix: string): string { let uid = prefix ?? 'random-id'; do { uid = `${prefix}-${Math.floor(Math.random() * 1000000).toString(10)}`; - } while (this.document.getElementById(uid)); + } while (this.#document.getElementById(uid)); return uid; } private createTooltipElement(): void { if (!this.tooltipRef) { - this.tooltipRef = this.viewContainerRef.createComponent(TooltipComponent); + this.tooltipRef = this.#viewContainerRef.createComponent(TooltipComponent); // this.viewContainerRef.detach(); } } @@ -161,46 +196,47 @@ export class TooltipDirective implements OnChanges, OnDestroy, OnInit { // @ts-ignore this.tooltipRef = undefined; this.popperInstance?.destroy(); - this.viewContainerRef?.detach(); - this.viewContainerRef?.clear(); + this.#viewContainerRef?.detach(); + this.#viewContainerRef?.clear(); } private addTooltipElement(): void { + if (!this.content()) { + this.destroyTooltipElement(); + return; + } + if (!this.tooltipRef) { this.createTooltipElement(); } - this.tooltipId = this.getUID('tooltip'); - this.tooltipRef.instance.id = this.tooltipId; - this.tooltipRef.instance.content = this.content; + this.tooltipRef?.setInput('content', this.content() ?? ''); - this.tooltip = this.tooltipRef.location.nativeElement; - this.renderer.addClass(this.tooltip, 'd-none'); - this.renderer.addClass(this.tooltip, 'fade'); + this.tooltip = this.tooltipRef?.location.nativeElement; + this.#renderer.addClass(this.tooltip, 'd-none'); + this.#renderer.addClass(this.tooltip, 'fade'); this.popperInstance?.destroy(); - this.viewContainerRef.insert(this.tooltipRef.hostView); - this.renderer.appendChild(this.document.body, this.tooltip); + this.#viewContainerRef.insert(this.tooltipRef.hostView); + this.#renderer.appendChild(this.#document.body, this.tooltip); - this.popperInstance = createPopper( - this.hostElement.nativeElement, - this.tooltip, - { ...this.popperOptions } - ); - if (!this.visible) { + this.popperInstance = createPopper(this.referenceRef().nativeElement, this.tooltip, { + ...this.popperOptionsComputed() + }); + + if (!this.visible()) { this.removeTooltipElement(); return; } - this.renderer.removeClass(this.tooltip, 'd-none'); - this.changeDetectorRef.markForCheck(); - setTimeout(() => { - this.tooltipRef.instance.visible = this.visible; - this.popperInstance.forceUpdate(); - this.changeDetectorRef.markForCheck(); + this.tooltipId = this.getUID('tooltip'); + this.tooltipRef?.setInput('id', this.tooltipId); + this.#renderer.removeClass(this.tooltip, 'd-none'); + this.tooltipRef?.setInput('visible', this.visible()); + this.popperInstance?.forceUpdate(); + this.#changeDetectorRef?.markForCheck(); }, 100); - } private removeTooltipElement(): void { @@ -208,11 +244,11 @@ export class TooltipDirective implements OnChanges, OnDestroy, OnInit { if (!this.tooltipRef) { return; } - this.tooltipRef.instance.visible = false; - this.tooltipRef.instance.id = undefined; - this.changeDetectorRef.markForCheck(); + this.tooltipRef.setInput('visible', false); + this.tooltipRef.setInput('id', undefined); + this.#changeDetectorRef.markForCheck(); setTimeout(() => { - this.viewContainerRef?.detach(); + this.#viewContainerRef?.detach(); }, 300); } } diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip.module.ts b/projects/coreui-angular/src/lib/tooltip/tooltip.module.ts index d076e2dd..c480a50a 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip.module.ts +++ b/projects/coreui-angular/src/lib/tooltip/tooltip.module.ts @@ -1,19 +1,15 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { TooltipComponent } from './tooltip/tooltip.component'; import { TooltipDirective } from './tooltip.directive'; @NgModule({ - declarations: [ - TooltipComponent, - TooltipDirective, - ], exports: [ TooltipComponent, - TooltipDirective, + TooltipDirective ], imports: [ - CommonModule + TooltipComponent, + TooltipDirective ] }) -export class TooltipModule { } +export class TooltipModule {} diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html index 0130d581..24e175d2 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html +++ b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html @@ -1,6 +1,6 @@
      - +
      diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.spec.ts b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.spec.ts index 082ab4bd..8d667069 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.spec.ts +++ b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.spec.ts @@ -8,9 +8,9 @@ describe('TooltipComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ TooltipComponent ] + imports: [TooltipComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { @@ -22,4 +22,9 @@ describe('TooltipComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css classes', () => { + expect(fixture.nativeElement).toHaveClass('tooltip'); + expect(fixture.nativeElement).toHaveClass('fade'); + }); }); diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.ts b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.ts index 47d4f51b..3fd614bc 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.ts +++ b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.ts @@ -1,73 +1,66 @@ import { - AfterViewInit, + booleanAttribute, Component, - HostBinding, - Input, - OnChanges, + computed, + effect, + inject, + input, OnDestroy, Renderer2, - SimpleChanges, TemplateRef, - ViewChild, + viewChild, ViewContainerRef } from '@angular/core'; @Component({ selector: 'c-tooltip', - templateUrl: './tooltip.component.html' + templateUrl: './tooltip.component.html', + host: { + class: 'tooltip fade bs-tooltip-auto', + '[class]': 'hostClasses()', + '[attr.role]': 'role()', + '[attr.id]': 'id()' + } }) -export class TooltipComponent implements AfterViewInit, OnChanges, OnDestroy { +export class TooltipComponent implements OnDestroy { + readonly renderer = inject(Renderer2); /** * Content of tooltip * @type {string | TemplateRef} */ - @Input() content: string | TemplateRef = ''; + readonly content = input>(''); + + readonly #contentEffect = effect(() => { + this.updateView(this.content()); + }); + /** * Toggle the visibility of popover component. * @type boolean */ - @Input() visible = false; - @Input() @HostBinding('attr.id') id?: string; - @Input() @HostBinding('attr.role') role = 'tooltip'; + readonly visible = input(false, { transform: booleanAttribute }); + readonly id = input(); + readonly role = input('tooltip'); - @ViewChild('tooltipTemplate', { read: ViewContainerRef }) viewContainerRef!: ViewContainerRef; + readonly viewContainerRef = viewChild('tooltipTemplate', { read: ViewContainerRef }); private textNode!: Text; - constructor( - private renderer: Renderer2 - ) { } - - @HostBinding('class') - get hostClasses(): { [klass: string]: any; } { + readonly hostClasses = computed(() => { return { tooltip: true, fade: true, - show: this.visible, + show: this.visible(), 'bs-tooltip-auto': true - }; - } - - ngAfterViewInit(): void { - setTimeout(() => { - this.updateView(this.content); - }); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['content']) { - setTimeout(() => { - this.updateView(this.content); - }); - } - } + } as Record; + }); ngOnDestroy(): void { this.clear(); } private clear(): void { - this.viewContainerRef?.clear(); + this.viewContainerRef()?.clear(); if (!!this.textNode) { this.renderer.removeChild(this.textNode.parentNode, this.textNode); } @@ -81,11 +74,11 @@ export class TooltipComponent implements AfterViewInit, OnChanges, OnDestroy { } if (content instanceof TemplateRef) { - this.viewContainerRef.createEmbeddedView(content); + this.viewContainerRef()?.createEmbeddedView(content); } else { this.textNode = this.renderer.createText(content); - const element = this.viewContainerRef.element.nativeElement; + const element = this.viewContainerRef()?.element.nativeElement; this.renderer.appendChild(element.parentNode, this.textNode); } } diff --git a/projects/coreui-angular/src/lib/utilities/align.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/align.directive.spec.ts index 13e35f90..bc7f8f75 100644 --- a/projects/coreui-angular/src/lib/utilities/align.directive.spec.ts +++ b/projects/coreui-angular/src/lib/utilities/align.directive.spec.ts @@ -1,8 +1,11 @@ +import { TestBed } from '@angular/core/testing'; import { AlignDirective } from './align.directive'; describe('AlignDirective', () => { it('should create an instance', () => { + TestBed.runInInjectionContext(() => { const directive = new AlignDirective(); expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/utilities/align.directive.ts b/projects/coreui-angular/src/lib/utilities/align.directive.ts index e5473810..936f5434 100644 --- a/projects/coreui-angular/src/lib/utilities/align.directive.ts +++ b/projects/coreui-angular/src/lib/utilities/align.directive.ts @@ -1,21 +1,22 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; import { Alignment } from '../coreui.types'; @Directive({ - selector: '[cAlign]' + selector: '[cAlign]', + exportAs: 'cAlign', + host: { '[class]': 'hostClasses()' } }) export class AlignDirective { /** * Set vertical alignment of inline, inline-block, inline-table, and table cell elements - * @type Alignment + * @return Alignment */ - @Input('cAlign') align?: Alignment; + readonly align = input(undefined, { alias: 'cAlign' }); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const align = this.align(); return { - [`align-${this.align}`]: !!this.align, - }; - } - + [`align-${align}`]: !!align + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/utilities/bg-color.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/bg-color.directive.spec.ts index 9fa8fa8b..15e2962b 100644 --- a/projects/coreui-angular/src/lib/utilities/bg-color.directive.spec.ts +++ b/projects/coreui-angular/src/lib/utilities/bg-color.directive.spec.ts @@ -1,8 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BgColorDirective } from './bg-color.directive'; +import { Component, DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [BgColorDirective], + template: '
      ' +}) +class TestComponent {} describe('BgColorDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(BgColorDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new BgColorDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new BgColorDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('bg-primary'); }); }); diff --git a/projects/coreui-angular/src/lib/utilities/bg-color.directive.ts b/projects/coreui-angular/src/lib/utilities/bg-color.directive.ts index 2c109b9e..dfbc261e 100644 --- a/projects/coreui-angular/src/lib/utilities/bg-color.directive.ts +++ b/projects/coreui-angular/src/lib/utilities/bg-color.directive.ts @@ -1,28 +1,28 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input } from '@angular/core'; import { BackgroundColors } from '../coreui.types'; @Directive({ - selector: '[cBgColor]' + selector: '[cBgColor]', + exportAs: 'cBgColor', + host: { '[class]': 'hostClasses()' } }) export class BgColorDirective { - /** * Set the background of an element to any contextual class */ - @Input('cBgColor') color: BackgroundColors = ''; + readonly cBgColor = input(''); + /** * Add linear gradient as background image to the backgrounds. - * @type boolean + * @return boolean */ - @Input() gradient?: boolean; + readonly gradient = input(); - @HostBinding('class') - get hostClasses(): any { + readonly hostClasses = computed(() => { + const color = this.cBgColor(); return { - [`bg-${this.color}`]: !!this.color, - 'bg-gradient': this.gradient, - }; - } - - constructor() { } + [`bg-${color}`]: !!color, + 'bg-gradient': this.gradient() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/utilities/border.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/border.directive.spec.ts index de88e38d..008d70a5 100644 --- a/projects/coreui-angular/src/lib/utilities/border.directive.spec.ts +++ b/projects/coreui-angular/src/lib/utilities/border.directive.spec.ts @@ -1,8 +1,62 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BorderDirective } from './border.directive'; +import { Component, DebugElement, input } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [BorderDirective], + template: '
      ' +}) +class TestComponent { + readonly border = input(1); +} describe('BorderDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(BorderDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new BorderDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new BorderDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('border-1'); + fixture.componentRef.setInput('border', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('border'); + fixture.componentRef.setInput('border', { + top: 1, + end: true, + color: 'primary', + start: { color: 'success', width: 2 } + }); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('border-top-1'); + expect(debugElement.nativeElement).toHaveClass('border-end'); + expect(debugElement.nativeElement).toHaveClass('border-color-primary'); + expect(debugElement.nativeElement).toHaveClass('border-start-2'); + expect(debugElement.nativeElement).toHaveClass('border-start-success'); + expect(debugElement.nativeElement.classList.length).toBe(5); + fixture.componentRef.setInput('border', {}); + fixture.detectChanges(); + expect(debugElement.nativeElement.classList.length).toBe(0); + fixture.componentRef.setInput('border', 1234n); + fixture.detectChanges(); + expect(debugElement.nativeElement.classList.length).toBe(0); }); }); diff --git a/projects/coreui-angular/src/lib/utilities/border.directive.ts b/projects/coreui-angular/src/lib/utilities/border.directive.ts index dfad3031..848187dd 100644 --- a/projects/coreui-angular/src/lib/utilities/border.directive.ts +++ b/projects/coreui-angular/src/lib/utilities/border.directive.ts @@ -1,43 +1,51 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { Border, BorderColor, IBorderElement, BorderWidth } from './border.type'; +import { computed, Directive, input } from '@angular/core'; +import { Border } from './border.type'; @Directive({ - selector: '[cBorder]' + selector: '[cBorder]', + exportAs: 'cBorder', + host: { '[class]': 'hostClasses()' } }) export class BorderDirective { /** * Add or remove an element’s borders - * @type Border + * @return Border */ - @Input('cBorder') border: Border = true; + readonly cBorder = input(true); - @HostBinding('class') - get hostClasses(): any { - - if ( typeof this.border === 'boolean' ) { - return { border: true }; + readonly hostClasses = computed>(() => { + const border = this.cBorder(); + if (typeof border === 'boolean') { + return { border: border }; } - if ( typeof this.border === 'number' || typeof this.border === 'string' ) { + if (typeof border === 'number' || typeof border === 'string') { return { border: true, - [`border-${this.border}`]: true + [`border-${border}`]: true }; } - if ( typeof this.border === 'object' ) { - const borderObj = { top: undefined, end: undefined, bottom: undefined, start: undefined, color: undefined, ...this.border }; + if (typeof border === 'object') { + const borderObj = { + top: undefined, + end: undefined, + bottom: undefined, + start: undefined, + color: undefined, + ...border + }; // @ts-ignore - const keys = Object.keys(borderObj).filter(key => borderObj[key] !== undefined); + const keys = Object.keys(borderObj).filter((key) => borderObj[key] !== undefined); const classes = {}; - keys.forEach(key => { + keys.forEach((key) => { // @ts-ignore const val = borderObj[key]; - if ( typeof val === 'boolean') { + if (typeof val === 'boolean') { // @ts-ignore classes[`border-${key}`] = true; - } else if ( typeof val === 'number' || typeof val === 'string' ) { + } else if (typeof val === 'number' || typeof val === 'string') { // @ts-ignore classes[`border-${key}-${val}`] = true; - } else if ( typeof val === 'object' ) { + } else if (typeof val === 'object') { if ('color' in val) { // @ts-ignore classes[`border-${key}-${val.color}`] = true; @@ -48,7 +56,8 @@ export class BorderDirective { } } }); - return Object.entries(classes).length === 0 ? {border: false} : classes; + return Object.entries(classes).length === 0 ? { border: false } : classes; } - } + return { border: false }; + }); } diff --git a/projects/coreui-angular/src/lib/utilities/public_api.ts b/projects/coreui-angular/src/lib/utilities/public_api.ts index 40efad68..a65cdb20 100644 --- a/projects/coreui-angular/src/lib/utilities/public_api.ts +++ b/projects/coreui-angular/src/lib/utilities/public_api.ts @@ -1,6 +1,8 @@ +export { AlignDirective } from './align.directive'; export { BgColorDirective } from './bg-color.directive'; export { BorderDirective } from './border.directive'; -export { TextColorDirective } from './text-color.directive'; export { RoundedDirective } from './rounded.directive'; -export { AlignDirective } from './align.directive'; +export { ShadowOnScrollDirective } from './shadow-on-scroll.directive'; +export { TextColorDirective } from './text-color.directive'; +export { TextBgColorDirective } from './text-bg-color.directive'; export { UtilitiesModule } from './utilities.module'; diff --git a/projects/coreui-angular/src/lib/utilities/rounded.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/rounded.directive.spec.ts index 986e6ad2..adbb61a1 100644 --- a/projects/coreui-angular/src/lib/utilities/rounded.directive.spec.ts +++ b/projects/coreui-angular/src/lib/utilities/rounded.directive.spec.ts @@ -1,8 +1,62 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RoundedDirective } from './rounded.directive'; +import { Component, DebugElement, input } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [RoundedDirective], + template: '
      ' +}) +class TestComponent { + readonly rounded = input(1); +} describe('RoundedDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(RoundedDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new RoundedDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new RoundedDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('rounded-1'); + fixture.componentRef.setInput('rounded', true); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('rounded'); + fixture.componentRef.setInput('rounded', { + top: false, + end: true, + circle: true, + pill: true, + size: 3 + }); + fixture.detectChanges(); + expect(debugElement.nativeElement).toHaveClass('rounded-3'); + expect(debugElement.nativeElement).toHaveClass('rounded-end'); + expect(debugElement.nativeElement).toHaveClass('rounded-circle'); + expect(debugElement.nativeElement).toHaveClass('rounded-pill'); + expect(debugElement.nativeElement.classList.length).toBe(4); + fixture.componentRef.setInput('rounded', {}); + fixture.detectChanges(); + expect(debugElement.nativeElement.classList.length).toBe(0); + fixture.componentRef.setInput('rounded', 1234n); + fixture.detectChanges(); + expect(debugElement.nativeElement.classList.length).toBe(0); }); }); diff --git a/projects/coreui-angular/src/lib/utilities/rounded.directive.ts b/projects/coreui-angular/src/lib/utilities/rounded.directive.ts index b26aa460..463c74b5 100644 --- a/projects/coreui-angular/src/lib/utilities/rounded.directive.ts +++ b/projects/coreui-angular/src/lib/utilities/rounded.directive.ts @@ -1,29 +1,29 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { Rounded, RoundedSize } from './rounded.type'; +import { computed, Directive, input } from '@angular/core'; +import { Rounded } from './rounded.type'; @Directive({ - selector: '[cRounded]' + selector: '[cRounded]', + exportAs: 'cRounded', + host: { '[class]': 'hostClasses()' } }) export class RoundedDirective { - /** * Set border radius variant and radius size * @type Rounded */ - @Input('cRounded') rounded: Rounded = true; - - @HostBinding('class') - get hostClasses(): any { + readonly cRounded = input(true); - if ( typeof this.rounded === 'boolean' ) { - return { rounded: true }; + readonly hostClasses = computed>(() => { + const rounded = this.cRounded(); + if (typeof rounded === 'boolean') { + return { rounded: rounded }; } - if ( typeof this.rounded === 'number' || typeof this.rounded === 'string' ) { + if (typeof rounded === 'number' || typeof rounded === 'string') { return { - [`rounded-${this.rounded}`]: true + [`rounded-${rounded}`]: true }; } - if ( typeof this.rounded === 'object' ) { + if (typeof rounded === 'object') { const roundedObj = { top: undefined, end: undefined, @@ -32,12 +32,12 @@ export class RoundedDirective { circle: undefined, pill: undefined, size: undefined, - ...this.rounded, + ...rounded }; // @ts-ignore - const keys = Object.keys(roundedObj).filter(key => roundedObj[key] !== undefined ); + const keys = Object.keys(roundedObj).filter((key) => roundedObj[key] !== undefined); const classes = {}; - keys.forEach(key => { + keys.forEach((key) => { // @ts-ignore const val = roundedObj[key]; if (typeof val === 'boolean') { @@ -49,7 +49,8 @@ export class RoundedDirective { } }); // console.log('rounded keys', keys, classes); - return Object.entries(classes).length === 0 ? {rounded: false} : classes; + return Object.entries(classes).length === 0 ? { rounded: false } : classes; } - } + return { rounded: false }; + }); } diff --git a/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.spec.ts new file mode 100644 index 00000000..f3f73879 --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.spec.ts @@ -0,0 +1,40 @@ +import { Component, DebugElement, ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ShadowOnScrollDirective } from './shadow-on-scroll.directive'; +import { By } from '@angular/platform-browser'; +import { DOCUMENT } from '@angular/common'; + +@Component({ + imports: [ShadowOnScrollDirective], + template: '
      ' +}) +class TestComponent {} + +class MockElementRef extends ElementRef {} + +describe('ShadowOnScrollDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + let document: Document; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent, ShadowOnScrollDirective], + providers: [{ provide: ElementRef, useClass: MockElementRef }] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + document = TestBed.inject(DOCUMENT); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(ShadowOnScrollDirective)); + fixture.detectChanges(); + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new ShadowOnScrollDirective(); + expect(directive).toBeTruthy(); + }); + }); +}); diff --git a/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.ts b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.ts new file mode 100644 index 00000000..fc865753 --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.ts @@ -0,0 +1,47 @@ +import { DOCUMENT } from '@angular/common'; +import { DestroyRef, Directive, effect, ElementRef, inject, input, signal, untracked, WritableSignal } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { fromEvent, Subscription } from 'rxjs'; + +@Directive({ + selector: '[cShadowOnScroll]', + exportAs: 'cShadowOnScroll' +}) +export class ShadowOnScrollDirective { + readonly #destroyRef: DestroyRef = inject(DestroyRef); + readonly #document: Document = inject(DOCUMENT); + readonly #elementRef: ElementRef = inject(ElementRef); + readonly #scrolled: WritableSignal = signal(false); + + readonly #scrollEffect = effect(() => { + this.#elementRef.nativeElement.classList.toggle(this.#shadowClass, this.#scrolled()); + }); + + #observable!: Subscription; + #shadowClass = 'shadow-sm'; + + constructor() { + this.#destroyRef.onDestroy(() => { + this.#scrollEffect?.destroy(); + }); + } + + readonly cShadowOnScroll = input<'sm' | 'lg' | 'none' | boolean>(true); + + readonly #shadowOnScrollEffect = effect(() => { + const value = this.cShadowOnScroll(); + untracked(() => { + this.#scrolled.set(false); + if (value) { + this.#shadowClass = value === true ? 'shadow' : `shadow-${value}`; + this.#observable = fromEvent(this.#document, 'scroll') + .pipe(takeUntilDestroyed(this.#destroyRef)) + .subscribe((scrolled) => { + this.#scrolled.set(this.#document.documentElement.scrollTop > 0); + }); + } else { + this.#observable?.unsubscribe(); + } + }); + }); +} diff --git a/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.spec.ts new file mode 100644 index 00000000..4a431c51 --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { TextBgColorDirective } from './text-bg-color.directive'; + +@Component({ + imports: [TextBgColorDirective], + template: '
      ' +}) +class TestComponent {} + +describe('TextBgColorDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(TextBgColorDirective)); + fixture.detectChanges(); + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new TextBgColorDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('text-bg-primary'); + }); +}); diff --git a/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.ts b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.ts new file mode 100644 index 00000000..3413b34e --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.ts @@ -0,0 +1,23 @@ +import { computed, Directive, input, InputSignal } from '@angular/core'; +import { Colors } from '../coreui.types'; + +@Directive({ + selector: '[cTextBgColor]', + host: { + '[class]': 'hostClasses()' + } +}) +export class TextBgColorDirective { + /** + * Set text-bg-color of element + * @type Colors + */ + readonly textBgColor: InputSignal = input('', { alias: 'cTextBgColor' }); + + readonly hostClasses = computed(() => { + const color = this.textBgColor(); + return { + [`text-bg-${color}`]: !!color + } as Record; + }); +} diff --git a/projects/coreui-angular/src/lib/utilities/text-color.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/text-color.directive.spec.ts index 9aa55a61..2ae601af 100644 --- a/projects/coreui-angular/src/lib/utilities/text-color.directive.spec.ts +++ b/projects/coreui-angular/src/lib/utilities/text-color.directive.spec.ts @@ -1,8 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { TextColorDirective } from './text-color.directive'; +import { Component, DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [TextColorDirective], + template: '
      ' +}) +class TestComponent {} describe('TextColorDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(TextColorDirective)); + fixture.detectChanges(); + }); + it('should create an instance', () => { - const directive = new TextColorDirective(); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new TextColorDirective(); + expect(directive).toBeTruthy(); + }); + }); + + it('should have css classes', () => { + expect(debugElement.nativeElement).toHaveClass('text-primary'); }); }); diff --git a/projects/coreui-angular/src/lib/utilities/text-color.directive.ts b/projects/coreui-angular/src/lib/utilities/text-color.directive.ts index 3bb485ef..f3625b7d 100644 --- a/projects/coreui-angular/src/lib/utilities/text-color.directive.ts +++ b/projects/coreui-angular/src/lib/utilities/text-color.directive.ts @@ -1,24 +1,23 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { computed, Directive, input, InputSignal } from '@angular/core'; import { TextColors } from '../coreui.types'; @Directive({ - selector: '[cTextColor]' + selector: '[cTextColor]', + host: { + '[class]': 'hostClasses()' + } }) export class TextColorDirective { - /** * Set text-color of element * @type TextColors */ - @Input('cTextColor') color: TextColors = ''; + readonly color: InputSignal = input('', { alias: 'cTextColor' }); - @HostBinding('class') - get hostClasses(): any { - const color = this.color; + readonly hostClasses = computed(() => { + const color = this.color(); return { [`text-${color}`]: !!color }; - } - - constructor() {} + }); } diff --git a/projects/coreui-angular/src/lib/utilities/utilities.module.ts b/projects/coreui-angular/src/lib/utilities/utilities.module.ts index b292e29f..b1b1bd0f 100644 --- a/projects/coreui-angular/src/lib/utilities/utilities.module.ts +++ b/projects/coreui-angular/src/lib/utilities/utilities.module.ts @@ -1,28 +1,27 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { BgColorDirective } from './bg-color.directive'; -import { BorderDirective } from './border.directive'; -import { RoundedDirective } from './rounded.directive'; -import { TextColorDirective } from './text-color.directive'; -import { AlignDirective } from './align.directive'; + +import { + AlignDirective, + BgColorDirective, + BorderDirective, + RoundedDirective, + ShadowOnScrollDirective, + TextBgColorDirective, + TextColorDirective +} from './public_api'; + +const UTILITY_DIRECTIVES = [ + AlignDirective, + BgColorDirective, + BorderDirective, + RoundedDirective, + ShadowOnScrollDirective, + TextColorDirective, + TextBgColorDirective +]; @NgModule({ - declarations: [ - BgColorDirective, - BorderDirective, - RoundedDirective, - TextColorDirective, - AlignDirective - ], - imports: [ - CommonModule - ], - exports: [ - BgColorDirective, - BorderDirective, - RoundedDirective, - TextColorDirective, - AlignDirective - ] + imports: [...UTILITY_DIRECTIVES], + exports: [...UTILITY_DIRECTIVES] }) -export class UtilitiesModule { } +export class UtilitiesModule {} diff --git a/projects/coreui-angular/src/lib/utilities/visible.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/visible.directive.spec.ts index cfe01ff1..68ac1dec 100644 --- a/projects/coreui-angular/src/lib/utilities/visible.directive.spec.ts +++ b/projects/coreui-angular/src/lib/utilities/visible.directive.spec.ts @@ -1,12 +1,37 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Component, DebugElement, input, TemplateRef, ViewContainerRef } from '@angular/core'; +import { By } from '@angular/platform-browser'; import { VisibleDirective } from './visible.directive'; -import { TemplateRef, ViewContainerRef } from '@angular/core'; + +@Component({ + imports: [VisibleDirective], + template: 'Test Node' +}) +class TestComponent { + readonly visible = input(true); +} describe('VisibleDirective', () => { - let templateRef: TemplateRef; - let viewContainerRef: ViewContainerRef; + let component: TestComponent; + let fixture: ComponentFixture; + let debugElement: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestComponent], + providers: [TemplateRef, ViewContainerRef] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + debugElement = fixture.debugElement.query(By.directive(VisibleDirective)); + fixture.detectChanges(); + }); it('should create an instance', () => { - const directive = new VisibleDirective(templateRef, viewContainerRef); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new VisibleDirective(); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/utilities/visible.directive.ts b/projects/coreui-angular/src/lib/utilities/visible.directive.ts index cb1d0463..e1d14e11 100644 --- a/projects/coreui-angular/src/lib/utilities/visible.directive.ts +++ b/projects/coreui-angular/src/lib/utilities/visible.directive.ts @@ -1,25 +1,37 @@ -import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'; +import { Directive, effect, inject, input, TemplateRef, ViewContainerRef } from '@angular/core'; @Directive({ - selector: '[cVisible]' + selector: '[cVisible]', + exportAs: 'cVisible' }) +/** + * A directive that conditionally includes a template based on the value of an input boolean. + * + * @example + * ```html + * Content to display + * ``` + * + * @remarks + * This directive uses Angular's dependency injection to get references to `TemplateRef` and `ViewContainerRef`. + * It creates or clears the embedded view based on the value of the `cVisible` input. + */ export class VisibleDirective { + readonly #templateRef = inject>(TemplateRef); + readonly #viewContainer = inject(ViewContainerRef); - constructor( - private templateRef: TemplateRef, - private viewContainer: ViewContainerRef - ) { } + #hasView!: boolean; - private hasView!: boolean; + readonly cVisible = input(); - @Input() set cVisible(condition: boolean) { - if (condition && !this.hasView) { - this.viewContainer.createEmbeddedView(this.templateRef); - this.hasView = true; - } else if (!condition && this.hasView) { - this.viewContainer.clear(); - this.hasView = false; + readonly #visibleEffect = effect(() => { + const condition = this.cVisible(); + if (condition && !this.#hasView) { + this.#viewContainer.createEmbeddedView(this.#templateRef); + this.#hasView = true; + } else if (!condition && this.#hasView) { + this.#viewContainer.clear(); + this.#hasView = false; } - } - + }); } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.html index 59a24c20..67defeaf 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.html @@ -1,30 +1,34 @@
      -
      - -
      -
      - -
      + @if (!!value() || templates?.['widgetValueTemplate']) { +
      + +
      + } + @if (!!title() || templates?.['widgetTitleTemplate']) { +
      + +
      + }
      - +
      - + - {{title}} + {{ title() }} - {{value}} + {{ value() }} - + - + diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.scss b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.spec.ts b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.spec.ts index e0c0ec32..60ee9577 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.spec.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.spec.ts @@ -1,7 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WidgetStatAComponent } from './widget-stat-a.component'; -import { CardModule } from '../../card'; describe('WidgetStatAComponent', () => { let component: WidgetStatAComponent; @@ -9,10 +8,8 @@ describe('WidgetStatAComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [WidgetStatAComponent], - imports: [CardModule] - }) - .compileComponents(); + imports: [WidgetStatAComponent] + }).compileComponents(); }); beforeEach(() => { @@ -24,4 +21,8 @@ describe('WidgetStatAComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css class"', () => { + expect(fixture.nativeElement).toHaveClass('card'); + }); }); diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts index b0ce1d9a..184684bb 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts @@ -1,56 +1,61 @@ -import { AfterContentInit, Component, ContentChildren, HostBinding, Input, QueryList } from '@angular/core'; +import { Component, computed, contentChildren, effect, input, InputSignal, TemplateRef } from '@angular/core'; import { Colors } from '../../coreui.types'; import { TemplateIdDirective } from '../../shared'; +import { CardBodyComponent, CardComponent } from '../../card'; +import { NgClass, NgTemplateOutlet } from '@angular/common'; @Component({ selector: 'c-widget-stat-a', templateUrl: './widget-stat-a.component.html', - styleUrls: ['./widget-stat-a.component.scss'], - exportAs: 'cWidgetStatA' + exportAs: 'cWidgetStatA', + imports: [CardBodyComponent, NgClass, NgTemplateOutlet], + host: { class: 'card', '[class]': 'hostClasses()' } }) -export class WidgetStatAComponent implements AfterContentInit { +export class WidgetStatAComponent extends CardComponent { /** * Sets the color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() color?: Colors; + // override readonly color = input(); + /** * Title of the widget to display * @type string */ - @Input() title?: string; + readonly title: InputSignal = input(); + /** * Value for your widget to display * @type string */ - @Input() value?: string; + readonly value: InputSignal = input(); + + templates: Record> = {}; - templates: any = {}; + readonly contentTemplates = contentChildren(TemplateIdDirective, { descendants: true }); - @ContentChildren(TemplateIdDirective, {descendants: true}) contentTemplates!: QueryList; + readonly #contentTemplatesEffect = effect(() => { + this.contentTemplates().forEach((child: TemplateIdDirective) => { + this.templates[child.id] = child.templateRef; + }); + }); - @HostBinding('class') - get hostClasses() { + override readonly hostClasses = computed(() => { + const color = this.color(); return { - 'card': true, - [`bg-${this.color}`]: !!this.color, - 'text-high-emphasis-inverse': !!this.color - } - } + card: true, + [`bg-${color}`]: !!color, + 'text-white': !!color + } as Record; + }); get bodyClasses() { return { 'pb-0': true, 'd-flex': true, 'justify-content-between': true, - 'align-items-start': true, - } - } - - ngAfterContentInit(): void { - this.contentTemplates.forEach((child: TemplateIdDirective) => { - this.templates[child.id] = child.templateRef; - }); + 'align-items-start': true + }; } } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html index 21a4821c..452b6d4e 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html @@ -1,8 +1,14 @@ -
      {{value}}
      -
      {{title}}
      - - - {{text}} - + @if (!!value()) { +
      {{ value() }}
      + } + @if (!!title()) { +
      {{ title() }}
      + } + + @if (text()) { + + {{ text() }} + + }
      diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.scss b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.spec.ts b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.spec.ts index d17113b8..4f48d014 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.spec.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.spec.ts @@ -1,7 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WidgetStatBComponent } from './widget-stat-b.component'; -import { CardModule } from '../../card'; describe('WidgetStatBComponent', () => { let component: WidgetStatBComponent; @@ -9,10 +8,8 @@ describe('WidgetStatBComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ WidgetStatBComponent ], - imports: [CardModule] - }) - .compileComponents(); + imports: [WidgetStatBComponent] + }).compileComponents(); }); beforeEach(() => { @@ -24,4 +21,8 @@ describe('WidgetStatBComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css class"', () => { + expect(fixture.nativeElement).toHaveClass('card'); + }); }); diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts index 5b9f6337..c40bc948 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts @@ -1,69 +1,65 @@ -import { Component, HostBinding, Input, OnInit } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Component, computed, input, InputSignal, InputSignalWithTransform } from '@angular/core'; +import { NgClass } from '@angular/common'; -import { Colors } from '../../coreui.types'; -import { CardComponent } from '../../card'; +import { CardBodyComponent, CardComponent } from '../../card'; @Component({ - selector: 'c-widget-stat-b', - templateUrl: './widget-stat-b.component.html', - styleUrls: ['./widget-stat-b.component.scss'], - exportAs: 'cWidgetStatB' + selector: 'c-widget-stat-b', + templateUrl: './widget-stat-b.component.html', + exportAs: 'cWidgetStatB', + imports: [CardBodyComponent, NgClass], + host: { class: 'card', '[class]': 'hostClasses()' } }) export class WidgetStatBComponent extends CardComponent { - constructor() { super(); } - static ngAcceptInputType_inverse: BooleanInput; - /** - * Sets the color context of the component to one of CoreUI’s themed colors. + * Sets the color context of the component to one of CoreUI themed colors. * @type Colors */ - @Input() override color?: Colors; + // override readonly color: InputSignal = input(); + /** - * Sets the text-color context of the component to one of CoreUI’s themed colors. - * @type Colors + * Sets the text-color context of the component to one of CoreUI themed colors. + * via TextColorDirective + * @type TextColors */ - @Input() override textColor?: Colors | 'white' | 'muted'; + // override readonly textColor: InputSignal = input(); + /** * Title of the widget to display * @type string */ - @Input() title?: string; + readonly title: InputSignal = input(); + /** * Helper text for your widget. * @type string */ - @Input() text?: string; + readonly text: InputSignal = input(); + /** * Value for your widget to display * @type string */ - @Input() value?: string; + readonly value: InputSignal = input(); + /** * Invert colors from their default dark shade. * @type boolean */ - @Input() - get inverse(): boolean { - return this._inverse; - } - set inverse(value: boolean) { - this._inverse = coerceBooleanProperty(value); - } - private _inverse = false; + readonly inverse: InputSignalWithTransform = input(false, { transform: booleanAttribute }); - @HostBinding('class') - override get hostClasses() { + override readonly hostClasses = computed(() => { + const color = this.color(); + const textColor = this.textColor(); return { - 'card': true, - [`bg-${this.color}`]: !!this.color, - [`text-${this.textColor}`]: !!this.textColor, - 'text-high-emphasis-inverse': !!this.color - } - } - + card: true, + [`bg-${color}`]: !!color, + [`text-${textColor}`]: !!textColor, + 'text-white': this.inverse() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.html index 1a78f351..da7e055d 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.html @@ -1,22 +1,28 @@ -
      - -
      -
      - {{value}} -
      -
      - {{title}} -
      - - - + @if (icon() || templates?.['widgetIconTemplate']) { +
      + +
      + } + @if (!!value()) { +
      + {{ value() }} +
      + } + @if (!!title()) { +
      + {{ title() }} +
      + } + @if (templates?.['widgetProgressTemplate']) { + + }
      - {{icon}} + {{ icon() }} - + diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.scss b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.spec.ts b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.spec.ts index a5d100c0..f0b20ae3 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.spec.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.spec.ts @@ -1,7 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WidgetStatCComponent } from './widget-stat-c.component'; -import { CardModule } from '../../card'; describe('WidgetStatCComponent', () => { let component: WidgetStatCComponent; @@ -9,10 +8,8 @@ describe('WidgetStatCComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ WidgetStatCComponent ], - imports: [CardModule] - }) - .compileComponents(); + imports: [WidgetStatCComponent] + }).compileComponents(); }); beforeEach(() => { @@ -24,4 +21,8 @@ describe('WidgetStatCComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css class"', () => { + expect(fixture.nativeElement).toHaveClass('card'); + }); }); diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts index 1dfdd8fa..8c1b3592 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts @@ -1,92 +1,82 @@ -import { AfterContentInit, Component, ContentChildren, HostBinding, Input, QueryList } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Component, computed, contentChildren, effect, input, TemplateRef } from '@angular/core'; -import { CardComponent } from '../../card'; +import { CardBodyComponent, CardComponent } from '../../card'; import { TemplateIdDirective } from '../../shared'; +import { NgClass, NgTemplateOutlet } from '@angular/common'; @Component({ selector: 'c-widget-stat-c', templateUrl: './widget-stat-c.component.html', - styleUrls: ['./widget-stat-c.component.scss'], - exportAs: 'cWidgetStatC' + exportAs: 'cWidgetStatC', + imports: [CardBodyComponent, NgClass, NgTemplateOutlet], + host: { '[class]': 'hostExtendedClass()' } }) -export class WidgetStatCComponent extends CardComponent implements AfterContentInit { - +export class WidgetStatCComponent extends CardComponent { constructor() { super(); } - static ngAcceptInputType_inverse: BooleanInput; - /** * Icon for your component. * @type string */ - @Input() icon?: string; + readonly icon = input(); + /** * Title of the widget to display * @type string */ - @Input() title?: string; + readonly title = input(); + /** * Value for your widget to display - * @type string + * @type string|number */ - @Input() value?: string | number; + readonly value = input(); + /** * Invert colors from their default dark shade. * @type boolean */ - @Input() - get inverse(): boolean { - return this._inverse; - } - set inverse(value: boolean) { - this._inverse = coerceBooleanProperty(value); - } - private _inverse = false; + readonly inverse = input(false, { transform: booleanAttribute }); - templates: any = {}; - @ContentChildren(TemplateIdDirective, {descendants: true}) contentTemplates!: QueryList; + templates: Record> = {}; + readonly contentTemplates = contentChildren(TemplateIdDirective, { descendants: true }); - @HostBinding('class') - get hostExtendedClass() { - return { - 'high-emphasis-inverse': this.inverse - } - } + readonly #contentTemplatesEffect = effect(() => { + this.contentTemplates().forEach((child: TemplateIdDirective) => { + this.templates[child.id] = child.templateRef; + }); + }); - get iconClasses() { - return { - 'mb-4': !this.textColor, - 'text-end': true, - 'text-medium-emphasis': !this.inverse, - 'text-medium-emphasis-inverse': this.inverse, - [`text-${this.textColor}`]: !!this.textColor, - } - } + readonly hostExtendedClass = computed(() => { + return { ...this.hostClasses(), 'text-white': this.inverse() } as Record; + }); - get titleClasses() { + readonly titleClasses = computed(() => { + const inverse = this.inverse(); return { - 'text-medium-emphasis': !this.inverse, - 'text-medium-emphasis-inverse': this.inverse, - [`text-${this.textColor}`]: !!this.textColor, - } - } + 'text-body-secondary': !inverse, + 'text-white': inverse, + 'text-opacity-75': inverse, + [`text-${this.textColor()}`]: !!this.textColor() + } as Record; + }); - get valueClasses() { + readonly valueClasses = computed(() => { return { - 'fs-4': !this.textColor, + 'fs-4': !this.textColor(), 'fw-semibold': true, - 'text-high-emphasis': !this.inverse, - 'text-high-emphasis-inverse': this.inverse, - [`text-${this.textColor}`]: !!this.textColor, - } - } + ...this.titleClasses(), + 'text-opacity-75': false + } as Record; + }); - ngAfterContentInit(): void { - this.contentTemplates.forEach((child: TemplateIdDirective) => { - this.templates[child.id] = child.templateRef; - }); - } + readonly iconClasses = computed(() => { + return { + 'mb-4': !this.textColor(), + 'text-end': true, + ...this.titleClasses() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html index 810aad75..0b9d8223 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html @@ -1,12 +1,14 @@ - - + + - -
      + @for (item of values(); track item; let i = $index) { + @if (i % 2 !== 0) { +
      + } -
      {{item.value}}
      -
      {{item.title}}
      +
      {{ item.value }}
      +
      {{ item.title }}
      -
      + }
      diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.scss b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.spec.ts b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.spec.ts index 73fab9cc..a0351fc6 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.spec.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.spec.ts @@ -1,7 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WidgetStatDComponent } from './widget-stat-d.component'; -import { CardModule } from '../../card'; describe('WidgetStatDComponent', () => { let component: WidgetStatDComponent; @@ -9,10 +8,8 @@ describe('WidgetStatDComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ WidgetStatDComponent ], - imports: [CardModule] - }) - .compileComponents(); + imports: [WidgetStatDComponent] + }).compileComponents(); }); beforeEach(() => { @@ -24,4 +21,8 @@ describe('WidgetStatDComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css class"', () => { + expect(fixture.nativeElement).toHaveClass('card'); + }); }); diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.ts index 7ac3c8b6..c9491e48 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.ts @@ -1,47 +1,41 @@ -import { Component, HostBinding, Input, OnInit } from '@angular/core'; +import { Component, computed, input } from '@angular/core'; import { Colors } from '../../coreui.types'; +import { CardBodyComponent, CardComponent, CardHeaderComponent } from '../../card'; +import { ColComponent, RowDirective } from '../../grid'; +import { NgClass } from '@angular/common'; export type WidgetStatDValue = { - title?: string, - value?: number | string, -} + title?: string; + value?: number | string; +}; @Component({ - selector: 'c-widget-stat-d', - templateUrl: './widget-stat-d.component.html', - styleUrls: ['./widget-stat-d.component.scss'], - exportAs: 'cWidgetStatD' + selector: 'c-widget-stat-d', + templateUrl: './widget-stat-d.component.html', + exportAs: 'cWidgetStatD', + imports: [CardHeaderComponent, CardBodyComponent, ColComponent, RowDirective, NgClass], + host: { class: 'card' } }) -export class WidgetStatDComponent { +export class WidgetStatDComponent extends CardComponent { /** * Sets the color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() color?: Colors; + // override readonly color = input(); + /** * Values and subtitles for your component. * @type WidgetStatDValue */ - @Input() values?: WidgetStatDValue[]; - - constructor() { - } + readonly values = input(); - @HostBinding('class') - get hostClasses() { - return { - 'card': true - } - } - - get headerClasses() { + readonly headerClasses = computed(() => { return { 'position-relative': true, 'd-flex': true, 'justify-content-center': true, 'align-items-center': true, - [`bg-${this.color}`]: this.color, - } - } - + [`bg-${this.color()}`]: this.color() + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.html index debefc45..dc90c734 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.html @@ -1,5 +1,9 @@ -
      {{title}}
      -
      {{value}}
      - + @if (!!title()) { +
      {{ title() }}
      + } + @if (!!value()) { +
      {{ value() }}
      + } +
      diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.scss b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.spec.ts b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.spec.ts index 4993f82c..0d136f19 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.spec.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.spec.ts @@ -1,7 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WidgetStatEComponent } from './widget-stat-e.component'; -import { CardModule } from '../../card'; describe('WidgetStatEComponent', () => { let component: WidgetStatEComponent; @@ -9,10 +8,8 @@ describe('WidgetStatEComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ WidgetStatEComponent ], - imports: [CardModule] - }) - .compileComponents(); + imports: [WidgetStatEComponent] + }).compileComponents(); }); beforeEach(() => { @@ -24,4 +21,8 @@ describe('WidgetStatEComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css class"', () => { + expect(fixture.nativeElement).toHaveClass('card'); + }); }); diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts index 97789236..0dc1b458 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts @@ -1,36 +1,38 @@ -import { Component, Input } from '@angular/core'; -import { CardComponent } from '../../card'; +import { Component, computed, input } from '@angular/core'; +import { NgClass } from '@angular/common'; +import { CardBodyComponent, CardComponent } from '../../card'; @Component({ - selector: 'c-widget-stat-e', - templateUrl: './widget-stat-e.component.html', - styleUrls: ['./widget-stat-e.component.scss'], - exportAs: 'cWidgetStatE' + selector: 'c-widget-stat-e', + templateUrl: './widget-stat-e.component.html', + exportAs: 'cWidgetStatE', + imports: [CardBodyComponent, NgClass] }) export class WidgetStatEComponent extends CardComponent { - constructor() { super(); } + /** * Title of the widget to display * @type string */ - @Input() title?: string; + readonly title = input(); + /** * Value for your widget to display * @type string | number */ - @Input() value?: string | number; + readonly value = input(); - get titleClasses() { + readonly titleClasses = computed(() => { + const textColor = this.textColor(); return { - 'text-medium-emphasis': !this.textColor, - 'small': true, + 'text-body-secondary': !textColor, + small: true, 'text-uppercase': true, 'fw-semibold': true, - [`text-${this.textColor}`]: !!this.textColor, - } - } - + [`text-${textColor}`]: !!textColor + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.html index 35ee8d07..66791959 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.html @@ -1,22 +1,24 @@ - -
      - + +
      +
      -
      {{value}}
      -
      {{title}}
      +
      {{ value() }}
      +
      {{ title() }}
      - - - + @if (footer() || templates?.['widgetFooterTemplate']) { + + + + } - {{icon}} + {{ icon() }} - {{footer}} + {{ footer() }} diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.scss b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.spec.ts b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.spec.ts index 2d741853..e43efbed 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.spec.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.spec.ts @@ -1,7 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { WidgetStatFComponent } from './widget-stat-f.component'; -import { CardModule } from '../../card'; describe('WidgetStatFComponent', () => { let component: WidgetStatFComponent; @@ -9,10 +8,8 @@ describe('WidgetStatFComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ WidgetStatFComponent ], - imports: [CardModule] - }) - .compileComponents(); + imports: [WidgetStatFComponent] + }).compileComponents(); }); beforeEach(() => { @@ -24,4 +21,8 @@ describe('WidgetStatFComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have css class"', () => { + expect(fixture.nativeElement).toHaveClass('card'); + }); }); diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts index 41ebb53e..cdf2bb31 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts @@ -1,112 +1,108 @@ -import { AfterContentInit, Component, ContentChildren, HostBinding, Input, QueryList } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Component, computed, contentChildren, effect, input, TemplateRef } from '@angular/core'; +import { NgClass, NgTemplateOutlet } from '@angular/common'; -import { TemplateIdDirective } from '../../shared'; import { Colors } from '../../coreui.types'; +import { TemplateIdDirective } from '../../shared'; +import { CardBodyComponent, CardComponent, CardFooterComponent } from '../../card'; @Component({ selector: 'c-widget-stat-f', templateUrl: './widget-stat-f.component.html', - styleUrls: ['./widget-stat-f.component.scss'], - exportAs: 'cWidgetStatB' + exportAs: 'cWidgetStatB', + imports: [CardBodyComponent, CardFooterComponent, NgClass, NgTemplateOutlet], + host: { class: 'card', '[class]': 'hostClasses()' } }) -export class WidgetStatFComponent implements AfterContentInit { - - static ngAcceptInputType_padding: BooleanInput; +export class WidgetStatFComponent extends CardComponent { /** * Sets the color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() color?: Colors; + // override readonly color = input(); + /** * Sets the text-color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() textColor?: Colors | 'white' | 'muted'; + // override readonly textColor = input(); + /** * Footer for your widget * @type string */ - @Input() footer?: string; + readonly footer = input(); + /** * Icon for your widget * @type string */ - @Input() icon?: string; + readonly icon = input(); /** * Set padding of your component. * @type boolean */ - @Input() - get padding(): boolean { - return this._padding; - } - set padding(value: boolean) { - this._padding = coerceBooleanProperty(value); - } - private _padding = false; + readonly padding = input(false, { transform: booleanAttribute }); /** * Title of the widget to display * @type string */ - @Input() title?: string; + readonly title = input(); + /** * Value for your widget to display * @type string */ - @Input() value?: string | number; + readonly value = input(); - templates: any = {}; - @ContentChildren(TemplateIdDirective, {descendants: true}) contentTemplates!: QueryList; + templates: Record> = {}; + readonly contentTemplates = contentChildren(TemplateIdDirective, { descendants: true }); - @HostBinding('class') - get hostClasses() { - return { - card: true - } - } + readonly #contentTemplatesEffect = effect(() => { + this.contentTemplates().forEach((child: TemplateIdDirective) => { + this.templates[child.id] = child.templateRef; + }); + }); - get cardBodyClasses() { + readonly cardBodyClasses = computed(() => { return { 'd-flex': true, 'align-items-center': true, - 'p-0': !this.padding, - } - } + 'p-0': !this.padding() + } as Record; + }); + + readonly iconClasses = computed(() => { + const color = this.color(); + const padding = this.padding(); - get iconClasses() { return { - 'me-3': !this.textColor, + 'me-3': !this.textColor(), 'text-white': true, - [`bg-${this.color}`]: !!this.color, - 'p-3': this.padding, - 'p-4': !this.padding, - } - } + [`bg-${color}`]: !!color, + 'p-3': padding, + 'p-4': !padding, + 'rounded-start-1': !padding + } as Record; + }); - get titleClasses() { + readonly titleClasses = computed(() => { + const textColor = this.textColor(); return { - 'text-medium-emphasis': !this.textColor, - 'small': true, + 'text-body-secondary': !textColor, + small: true, 'text-uppercase': true, 'fw-semibold': true, - [`text-${this.textColor}`]: !!this.textColor, - } - } + [`text-${textColor}`]: !!textColor + } as Record; + }); - get valueClasses() { + readonly valueClasses = computed(() => { + const textColor = this.textColor(); return { - 'fs-6': !this.textColor, + 'fs-6': !textColor, 'fw-semibold': true, - [`text-${this.textColor}`]: !!this.textColor, - } - } - - ngAfterContentInit(): void { - this.contentTemplates.forEach((child: TemplateIdDirective) => { - this.templates[child.id] = child.templateRef; - }); - } + [`text-${textColor}`]: !!textColor + } as Record; + }); } diff --git a/projects/coreui-angular/src/lib/widget/widget.module.ts b/projects/coreui-angular/src/lib/widget/widget.module.ts index 5ea0e142..96e9e990 100644 --- a/projects/coreui-angular/src/lib/widget/widget.module.ts +++ b/projects/coreui-angular/src/lib/widget/widget.module.ts @@ -1,8 +1,4 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { CardModule } from '../card'; -import { GridModule } from '../grid'; import { WidgetStatAComponent } from './widget-stat-a/widget-stat-a.component'; import { WidgetStatBComponent } from './widget-stat-b/widget-stat-b.component'; @@ -12,7 +8,7 @@ import { WidgetStatEComponent } from './widget-stat-e/widget-stat-e.component'; import { WidgetStatFComponent } from './widget-stat-f/widget-stat-f.component'; @NgModule({ - declarations: [ + imports: [ WidgetStatAComponent, WidgetStatBComponent, WidgetStatCComponent, @@ -20,11 +16,6 @@ import { WidgetStatFComponent } from './widget-stat-f/widget-stat-f.component'; WidgetStatEComponent, WidgetStatFComponent ], - imports: [ - CommonModule, - CardModule, - GridModule, - ], exports: [ WidgetStatAComponent, WidgetStatBComponent, @@ -34,5 +25,4 @@ import { WidgetStatFComponent } from './widget-stat-f/widget-stat-f.component'; WidgetStatFComponent ] }) -export class WidgetModule { -} +export class WidgetModule {} diff --git a/projects/coreui-angular/src/public-api.ts b/projects/coreui-angular/src/public-api.ts index 5dfcd2c6..c41fde86 100644 --- a/projects/coreui-angular/src/public-api.ts +++ b/projects/coreui-angular/src/public-api.ts @@ -8,6 +8,7 @@ export * from './lib/accordion'; export * from './lib/alert'; export * from './lib/avatar'; export * from './lib/badge'; +export * from './lib/backdrop'; export * from './lib/breadcrumb'; export * from './lib/button'; export * from './lib/button-group'; @@ -31,10 +32,11 @@ export * from './lib/placeholder'; export * from './lib/popover'; export * from './lib/progress'; export * from './lib/services'; -export * from './lib/spinner'; export * from './lib/sidebar'; +export * from './lib/spinner'; export * from './lib/table'; export * from './lib/tabs'; +export * from './lib/tabs-2'; export * from './lib/toast'; export * from './lib/tooltip'; export * from './lib/utilities'; diff --git a/projects/coreui-angular/src/test.ts b/projects/coreui-angular/src/test.ts index 1c114a05..16a90bfc 100644 --- a/projects/coreui-angular/src/test.ts +++ b/projects/coreui-angular/src/test.ts @@ -3,26 +3,14 @@ import 'zone.js'; import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; +import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; -declare const require: { - context(path: string, deep?: boolean, filter?: RegExp): { - (id: string): T; - keys(): string[]; - }; -}; +// make the warning to fail +// console.warn = (message) => { +// throw new Error(message); +// }; // First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting(), - { teardown: { destroyAfterEach: true }}, -); - -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); +getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { + teardown: { destroyAfterEach: true } +}); diff --git a/projects/coreui-angular/tsconfig.json b/projects/coreui-angular/tsconfig.json index b3e0d01a..56f4fc9e 100644 --- a/projects/coreui-angular/tsconfig.json +++ b/projects/coreui-angular/tsconfig.json @@ -9,6 +9,9 @@ }, { "path": "./tsconfig.spec.json" + }, + { + "path": "./tsconfig.schematics.json" } ] } diff --git a/projects/coreui-angular/tsconfig.lib.json b/projects/coreui-angular/tsconfig.lib.json index b77b13c0..31e1e6a1 100644 --- a/projects/coreui-angular/tsconfig.lib.json +++ b/projects/coreui-angular/tsconfig.lib.json @@ -11,5 +11,8 @@ "exclude": [ "src/test.ts", "**/*.spec.ts" - ] + ], + "angularCompilerOptions": { + "compilationMode": "partial" + } } diff --git a/projects/coreui-angular/tsconfig.schematics.json b/projects/coreui-angular/tsconfig.schematics.json new file mode 100644 index 00000000..513e9c46 --- /dev/null +++ b/projects/coreui-angular/tsconfig.schematics.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "lib": [ + "ES2022", + "dom" + ], + "declaration": true, + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "rootDir": "schematics", + "outDir": "../../dist/coreui-angular/schematics", + "resolveJsonModule": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strictNullChecks": true, + "target": "ES2022", + "types": [ + "jasmine", + "node" + ] + }, + "include": [ + "schematics/**/*" + ], + "exclude": [ + "schematics/*/files/**/*" + ] +} diff --git a/projects/coreui-icons-angular/.browserslistrc b/projects/coreui-icons-angular/.browserslistrc deleted file mode 100644 index 4f9ac269..00000000 --- a/projects/coreui-icons-angular/.browserslistrc +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR diff --git a/projects/coreui-icons-angular/.eslintrc.json b/projects/coreui-icons-angular/.eslintrc.json deleted file mode 100644 index e7686e15..00000000 --- a/projects/coreui-icons-angular/.eslintrc.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "!**/*" - ], - "overrides": [ - { - "files": [ - "*.ts" - ], - "parserOptions": { - "project": [ - "./tsconfig.json" - ], - "createDefaultProgram": true - }, - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "c", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "warn", - { - "type": "element", - "prefix": "c", - "style": "kebab-case" - } - ], - "@angular-eslint/no-input-rename": [ - "warn" - ] - } - }, - { - "files": [ - "*.html" - ], - "rules": {} - } - ] -} diff --git a/projects/coreui-icons-angular/LICENSE b/projects/coreui-icons-angular/LICENSE new file mode 100644 index 00000000..fbb053e0 --- /dev/null +++ b/projects/coreui-icons-angular/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 creativeLabs Łukasz Holeczek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/projects/coreui-icons-angular/README.md b/projects/coreui-icons-angular/README.md index f0501474..5b086726 100644 --- a/projects/coreui-icons-angular/README.md +++ b/projects/coreui-icons-angular/README.md @@ -24,19 +24,34 @@ · Blog

      +
      +

      +Featured CoreUI for Angular libraries: +
      CoreUI Components for Angular +
      CoreUI Angular wrapper for Chart.js v4 +
      CoreUI Icons for Angular +

      +
      # CoreUI Icons Angular ![angular][angular-badge] -[![NPM](https://img.shields.io/npm/v/@coreui/icons-angular/latest?style=flat-square&color=brightgreen)][coreui-angular-icons-npm] -[![npm-coreui-angular-next][npm-coreui-icons-angular-next]][coreui-angular-icons-npm] -[![Downloads](https://img.shields.io/npm/dm/@coreui/icons-angular.svg?style=flat-square)][coreui-angular-icons-npm] -[![License](https://img.shields.io/npm/l/@coreui/angular?style=flat-square)][coreui] +[![npm-coreui-angular-v5-ng19][npm-coreui-icons-angular-v5-ng19]][coreui-angular-icons-npm] +[![npm-coreui-angular-latest][npm-coreui-icons-angular-latest]][coreui-angular-icons-npm] +[![npm-coreui-angular-next][npm-coreui-icons-angular-next]][coreui-angular-icons-npm] +[![License](https://img.shields.io/npm/l/@coreui/angular?style=flat-square)][coreui] +[![Downloads](https://img.shields.io/npm/dm/@coreui/icons-angular.svg?style=flat-square)][coreui-angular-icons-npm] +[![Project icons check](https://github.com/coreui/coreui-angular/actions/workflows/project-icons-check.yml/badge.svg)](https://github.com/coreui/coreui-angular/actions/workflows/project-icons-check.yml) [coreui]: https://coreui.io/icons [coreui-angular-icons-npm]: https://www.npmjs.com/package/@coreui/icons-angular -[npm-coreui-icons-angular-next]: https://img.shields.io/npm/v/@coreui/icons-angular/next.png?style=flat-square&color=red -[angular-badge]: https://img.shields.io/badge/angular-^14.0.0-lightgrey.svg?style=flat-square&logo=angular +[npm-coreui-icons-angular-v5-ng19]: https://img.shields.io/npm/v/@coreui/icons-angular/v5-ng19?style=flat-square&color=brightgreen +[npm-coreui-icons-angular-latest]: https://img.shields.io/npm/v/@coreui/icons-angular/latest?style=flat-square&color=brightgreen +[npm-coreui-icons-angular-next]: https://img.shields.io/npm/v/@coreui/icons-angular/next?style=flat-square&color=red +[angular-badge]: https://img.shields.io/badge/angular-^19.2.0-lightgrey.svg?style=flat-square&logo=angular ## `cIcon` directive @@ -56,8 +71,8 @@ For directive description visit [https://coreui.io/angular/docs/](https://coreui ### Installation ```shell -npm install @coreui/icons -npm install @coreui/icons-angular +npm install @coreui/icons@3 +npm install @coreui/icons-angular@~5.4 ``` ### Usage @@ -169,5 +184,5 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2022 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2025 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/projects/coreui-icons-angular/eslint.config.js b/projects/coreui-icons-angular/eslint.config.js new file mode 100644 index 00000000..1470027e --- /dev/null +++ b/projects/coreui-icons-angular/eslint.config.js @@ -0,0 +1,15 @@ +// @ts-check +const tseslint = require('typescript-eslint'); +const rootConfig = require('../../eslint.config.js'); + +module.exports = tseslint.config( + ...rootConfig, + { + files: ['**/*.ts'], + rules: {} + }, + { + files: ['**/*.html'], + rules: {} + } +); diff --git a/projects/coreui-icons-angular/karma.conf.js b/projects/coreui-icons-angular/karma.conf.js index f13a89fc..d15a98c2 100644 --- a/projects/coreui-icons-angular/karma.conf.js +++ b/projects/coreui-icons-angular/karma.conf.js @@ -27,17 +27,20 @@ module.exports = function (config) { coverageReporter: { dir: require('path').join(__dirname, '../../coverage/coreui-icons-angular'), subdir: '.', - reporters: [ - { type: 'html' }, - { type: 'text-summary' } - ] + reporters: [{ type: 'html' }, { type: 'text-summary' }] }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['Chrome'], + browsers: ['Chrome_Custom'], + customLaunchers: { + Chrome_Custom: { + base: 'Chrome', + flags: ['--disable-search-engine-choice-screen'] + } + }, singleRun: false, restartOnFileChange: true }); diff --git a/projects/coreui-icons-angular/package.json b/projects/coreui-icons-angular/package.json index 858efbda..1349e6d8 100644 --- a/projects/coreui-icons-angular/package.json +++ b/projects/coreui-icons-angular/package.json @@ -1,8 +1,8 @@ { "name": "@coreui/icons-angular", - "version": "4.2.15", + "version": "5.4.9", "description": "CoreUI Icons Angular component and service", - "copyright": "Copyright 2022 creativeLabs Łukasz Holeczek", + "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT", "homepage": "https://coreui.io/angular", "author": { @@ -25,13 +25,14 @@ "url": "https://github.com/coreui/coreui-angular/issues" }, "peerDependencies": { - "@angular/common": "^14.0.0", - "@angular/core": "^14.0.0", - "@coreui/icons": "^2.1.0" + "@angular/common": "^19.2.0", + "@angular/core": "^19.2.0", + "@angular/platform-browser": "^19.2.0" }, "dependencies": { "tslib": "^2.3.0" }, + "sideEffects": false, "keywords": [ "coreui", "coreui-icons", @@ -42,5 +43,17 @@ "layout", "component", "angular" - ] + ], + "devDependencies": { + "copyfiles": "file:../../node_modules/copyfiles", + "typescript": "file:../../node_modules/typescript" + }, + "schematics": "./schematics/collection.json", + "scripts": { + "build": "tsc -p tsconfig.schematics.json", + "postbuild": "copyfiles schematics/*/files/** schematics/collection.json ../../dist/coreui-icons-angular/" + }, + "ng-add": { + "save": true + } } diff --git a/projects/coreui-icons-angular/schematics/collection.json b/projects/coreui-icons-angular/schematics/collection.json new file mode 100644 index 00000000..72b8543b --- /dev/null +++ b/projects/coreui-icons-angular/schematics/collection.json @@ -0,0 +1,9 @@ +{ + "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", + "schematics": { + "ng-add": { + "description": "Add @coreui/icons-angular library to the project.", + "factory": "./ng-add/index#ngAdd" + } + } +} diff --git a/projects/coreui-icons-angular/schematics/ng-add/index.ts b/projects/coreui-icons-angular/schematics/ng-add/index.ts new file mode 100644 index 00000000..13b3188d --- /dev/null +++ b/projects/coreui-icons-angular/schematics/ng-add/index.ts @@ -0,0 +1,49 @@ +import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics'; +import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; +import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies'; +import { getPackageVersionFromPackageJson, PackageJson } from './package-config'; +import * as pkgJson from '../../package.json'; + +export function ngAdd(): Rule { + return (tree: Tree, context: SchematicContext) => { + const pkg = pkgJson as unknown as PackageJson; + + context.logger.info(``); + context.logger.info(`Installing ${pkg.name} dependencies...`); + + const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core'); + context.logger.info(`@angular/core version ${ngCoreVersionTag}`); + if (!ngCoreVersionTag) { + throw new SchematicsException('@angular/core version not found'); + } + + const projectDeps: NodeDependency[] = [ + { name: '@angular/common', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false }, + { name: '@angular/core', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false }, + { + name: '@angular/platform-browser', + type: NodeDependencyType.Default, + version: ngCoreVersionTag, + overwrite: false + } + ]; + + projectDeps.forEach((dep) => { + addPackageJsonDependency(tree, dep); + context.logger.info(`Added dependency: ${dep.name}@${dep.version}`); + }); + + const library: NodeDependency = { + name: pkg.name, + type: NodeDependencyType.Default, + version: `~${pkg.version}`, + overwrite: true + }; + + addPackageJsonDependency(tree, library); + context.logger.info(`Installing ${library.name}@${library.version}`); + context.addTask(new NodePackageInstallTask()); + + return tree; + }; +} diff --git a/projects/coreui-icons-angular/schematics/ng-add/package-config.ts b/projects/coreui-icons-angular/schematics/ng-add/package-config.ts new file mode 100644 index 00000000..95c3c1d1 --- /dev/null +++ b/projects/coreui-icons-angular/schematics/ng-add/package-config.ts @@ -0,0 +1,68 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import { Tree } from '@angular-devkit/schematics'; + +export interface PackageJson { + dependencies: Record; + name: string; + peerDependencies: Record; + version: string; +} + +/** + * Sorts the keys of the given object. + * @returns A new object instance with sorted keys + */ +function sortObjectByKeys(obj: Record) { + return Object.keys(obj) + .sort() + .reduce( + (result, key) => { + result[key] = obj[key]; + return result; + }, + {} as Record + ); +} + +/** Adds a package to the package.json in the given host tree. */ +export function addPackageToPackageJson(host: Tree, pkg: string, version: string): Tree { + if (host.exists('package.json')) { + const sourceText = host.read('package.json')!.toString('utf-8'); + const json = JSON.parse(sourceText) as PackageJson; + + if (!json.dependencies) { + json.dependencies = {}; + } + + if (!json.dependencies[pkg]) { + json.dependencies[pkg] = version; + json.dependencies = sortObjectByKeys(json.dependencies); + } + + host.overwrite('package.json', JSON.stringify(json, null, 2)); + } + + return host; +} + +/** Gets the version of the specified package by looking at the package.json in the given tree. */ +export function getPackageVersionFromPackageJson(tree: Tree, name: string): string | null { + if (!tree.exists('package.json')) { + return null; + } + + const packageJson = JSON.parse(tree.read('package.json')!.toString('utf8')) as PackageJson; + + if (packageJson.dependencies && packageJson.dependencies[name]) { + return packageJson.dependencies[name]; + } + + return null; +} diff --git a/projects/coreui-icons-angular/src/index.ts b/projects/coreui-icons-angular/src/index.ts new file mode 100644 index 00000000..7e1a213e --- /dev/null +++ b/projects/coreui-icons-angular/src/index.ts @@ -0,0 +1 @@ +export * from './public-api'; diff --git a/projects/coreui-icons-angular/src/lib/icon-set/icon-set.module.ts b/projects/coreui-icons-angular/src/lib/icon-set/icon-set.module.ts index c5b07184..2506d515 100644 --- a/projects/coreui-icons-angular/src/lib/icon-set/icon-set.module.ts +++ b/projects/coreui-icons-angular/src/lib/icon-set/icon-set.module.ts @@ -1,18 +1,14 @@ -import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core'; -import { CommonModule } from '@angular/common'; +import { ModuleWithProviders, NgModule, inject } from '@angular/core'; import { IconSetService } from './icon-set.service'; @NgModule({ - imports: [ - CommonModule - ], - providers: [ - IconSetService - ] + providers: [IconSetService] }) export class IconSetModule { - constructor(@Optional() @SkipSelf() parentModule?: IconSetModule) { + constructor() { + const parentModule = inject(IconSetModule, { optional: true, skipSelf: true }); + if (parentModule) { throw new Error( 'CoreUI IconSetModule is already loaded. Import it in the AppModule only'); diff --git a/projects/coreui-icons-angular/src/lib/icon-set/icon-set.service.ts b/projects/coreui-icons-angular/src/lib/icon-set/icon-set.service.ts index c2c9635a..3ab9bccf 100644 --- a/projects/coreui-icons-angular/src/lib/icon-set/icon-set.service.ts +++ b/projects/coreui-icons-angular/src/lib/icon-set/icon-set.service.ts @@ -8,24 +8,24 @@ export interface IIconSet { providedIn: 'root' }) export class IconSetService { - - constructor() {} - public get iconNames() { - return this._iconNames; - }; - private _iconNames: { [key: string]: string } = {}; + return this.#iconNames; + } + + #iconNames: Record = {}; get icons(): IIconSet { - return this._icons; + return this.#icons; } + set icons(iconSet) { for (const iconsKey in iconSet) { - this._iconNames[iconsKey] = iconsKey; + this.#iconNames[iconsKey] = iconsKey; } - this._icons = iconSet; + this.#icons = iconSet; } - private _icons: IIconSet = {}; + + #icons: IIconSet = {}; public getIcon(name: string): string[] { const icon = this.icons[name]; diff --git a/projects/coreui-icons-angular/src/lib/icon-set/public_api.ts b/projects/coreui-icons-angular/src/lib/icon-set/public_api.ts index a7057148..05c4a587 100644 --- a/projects/coreui-icons-angular/src/lib/icon-set/public_api.ts +++ b/projects/coreui-icons-angular/src/lib/icon-set/public_api.ts @@ -1,2 +1,2 @@ -export { IconSetService, IIconSet } from './icon-set.service'; +export { IconSetService, type IIconSet } from './icon-set.service'; export { IconSetModule } from './icon-set.module'; diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.component.spec.ts b/projects/coreui-icons-angular/src/lib/icon/icon.component.spec.ts index ece5574f..7ae5c5a6 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.component.spec.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.component.spec.ts @@ -1,47 +1,44 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { Component, DebugElement, ViewChild } from '@angular/core'; +import { Component, DebugElement, inject, ViewChild } from '@angular/core'; +import { By } from '@angular/platform-browser'; import { cilList } from '@coreui/icons'; import { HtmlAttributesDirective } from '../shared/html-attr.directive'; -import { IconComponent } from './icon.component'; import { IconSetService } from '../icon-set'; -import { By } from '@angular/platform-browser'; +import { IconComponent } from './icon.component'; @Component({ - template: ` -
      - -
      ` + template: ``, + imports: [IconComponent], + providers: [IconSetService] }) class TestComponent { - @ViewChild('icon', {read: IconComponent}) iconRef!: IconComponent; + iconSet = inject(IconSetService); - constructor( - public iconSet: IconSetService - ) { - this.iconSet.icons = {cilList}; + @ViewChild('icon', { read: IconComponent }) iconRef!: IconComponent; + + constructor() { + this.iconSet.icons = { cilList }; } } - describe('IconComponent', () => { - let inputEl: DebugElement; + let debugEl: DebugElement; let component: TestComponent; let fixture: ComponentFixture; beforeEach(async () => { TestBed.configureTestingModule({ - declarations: [TestComponent, IconComponent, HtmlAttributesDirective], + imports: [TestComponent, IconComponent, HtmlAttributesDirective], providers: [IconSetService] }).compileComponents(); - }); beforeEach(() => { fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; fixture.detectChanges(); - inputEl = fixture.debugElement.query(By.css('svg')); + debugEl = fixture.debugElement.query(By.css('svg')); }); it('should create', () => { @@ -53,13 +50,13 @@ describe('IconComponent', () => { }); it('icon component should render', () => { expect(component.iconRef).toBeTruthy(); - expect(component.iconRef.name).toBe('cilList'); + expect(component.iconRef.name()).toBe('cilList'); expect(component.iconRef.svgElementRef).toBeTruthy(); }); it('icon classes should be applied', () => { - expect(inputEl.nativeElement).toBeTruthy(); - expect(inputEl.nativeElement).toHaveClass('icon'); - expect(inputEl.nativeElement).toHaveClass('icon-lg'); - expect(inputEl.nativeElement).toHaveClass('test'); + expect(debugEl.nativeElement).toBeTruthy(); + expect(debugEl.nativeElement).toHaveClass('icon'); + expect(debugEl.nativeElement).toHaveClass('icon-lg'); + expect(debugEl.nativeElement).toHaveClass('test'); }); }); diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.component.svg b/projects/coreui-icons-angular/src/lib/icon/icon.component.svg index 36a7de4e..55c742cd 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.component.svg +++ b/projects/coreui-icons-angular/src/lib/icon/icon.component.svg @@ -1,25 +1,30 @@ - - - - - - +@if (!use() && !!code()) { + +} @else if (use()) { + +} diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.component.ts b/projects/coreui-icons-angular/src/lib/icon/icon.component.ts index 4ebf3793..f0ad100d 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.component.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.component.ts @@ -1,109 +1,102 @@ -import { AfterViewInit, Component, ElementRef, Input, Renderer2, ViewChild } from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { NgClass } from '@angular/common'; +import { Component, computed, effect, ElementRef, inject, input, Renderer2, viewChild } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +import { HtmlAttributesDirective } from '../shared/html-attr.directive'; import { IconSetService } from '../icon-set'; -import { IconSize, IIcon } from './icon.interface'; +import { IconSize, IIcon, NgCssClass } from './icon.interface'; +import { transformName } from './icon.utils'; @Component({ + exportAs: 'cIconComponent', + imports: [NgClass, HtmlAttributesDirective], selector: 'c-icon', + styleUrls: ['./icon.component.scss'], templateUrl: './icon.component.svg', - styleUrls: ['./icon.component.scss'] + host: { ngSkipHydration: 'true', style: 'display: none' } }) -export class IconComponent implements IIcon, AfterViewInit { +export class IconComponent implements IIcon { + readonly #renderer = inject(Renderer2); + readonly #elementRef = inject(ElementRef); + readonly #sanitizer = inject(DomSanitizer); + readonly #iconSet = inject(IconSetService); + + readonly content = input(); - @Input() attributes: any = {role: 'img'}; - @Input() content?: string | string[] | any[]; - @Input() size: IconSize = ''; - @Input() title?: string; - @Input() use = ''; - @Input() customClasses?: string | string[] | Set | { [klass: string]: any } = ''; - @Input() width?: string; - @Input() height?: string; + readonly attributes = input>({ role: 'img' }); + readonly customClasses = input(); + readonly size = input(''); + readonly title = input(); + readonly use = input(''); + readonly height = input(); + readonly width = input(); + readonly name = input('', { transform: transformName }); + readonly viewBoxInput = input(undefined, { alias: 'viewBox' }); - @Input() - set name(name: string) { - this._name = name.includes('-') ? this.toCamelCase(name) : name; - } - get name(): string { - return this._name; - } - private _name!: string; + readonly svgElementRef = viewChild('svgElement'); - @Input() - set viewBox(viewBox: string) { - this._viewBox = viewBox; - } - get viewBox(): string { - return this._viewBox ?? this.scale; - } - private _viewBox!: string; + readonly #svgElementEffect = effect(() => { + const svgElementRef = this.svgElementRef(); + const hostElement: Element = this.#elementRef.nativeElement; + if (svgElementRef && hostElement) { + const svgElement = svgElementRef.nativeElement; + hostElement.classList?.forEach((item: string) => { + this.#renderer.addClass(svgElement, item); + }); + const parentElement = this.#renderer.parentNode(hostElement); + this.#renderer.insertBefore(parentElement, svgElement, hostElement); + this.#renderer.removeChild(parentElement, hostElement); + } + }); - @ViewChild('svgElement', {read: ElementRef}) svgElementRef!: ElementRef; + readonly viewBox = computed(() => { + return this.viewBoxInput() ?? this.scale(); + }); - get innerHtml(): SafeHtml { - const code = Array.isArray(this.code) ? this.code[1] || this.code[0] : this.code ?? ''; + readonly innerHtml = computed(() => { + const codeVal = this.code(); + const code = Array.isArray(codeVal) ? (codeVal?.[1] ?? codeVal?.[0] ?? '') : codeVal || ''; // todo proper sanitize // const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, code); - return this.sanitizer.bypassSecurityTrustHtml((this.titleCode + code) ?? ''); - } - - constructor( - private renderer: Renderer2, - private elementRef: ElementRef, - private sanitizer: DomSanitizer, - private iconSet: IconSetService - ) { - this.renderer.setStyle(this.elementRef.nativeElement, 'display', 'none'); - } + return this.#sanitizer.bypassSecurityTrustHtml(this.#titleCode() + code || ''); + }); - ngAfterViewInit(): void { - this.elementRef.nativeElement.classList.forEach((item: string) => { - this.renderer.addClass(this.svgElementRef.nativeElement, item); - }); - const parentElement = this.renderer.parentNode(this.elementRef.nativeElement); - const svgElement = this.svgElementRef.nativeElement; - this.renderer.insertBefore(parentElement, svgElement, this.elementRef.nativeElement); - this.renderer.removeChild(parentElement, this.elementRef.nativeElement); - } + readonly #titleCode = computed(() => { + return this.title() ? `${this.title()}` : ''; + }); - get titleCode(): string { - return this.title ? `${this.title}` : ''; - } - - get code(): string | string[] | undefined { - if (this.content) { - return this.content; + readonly code = computed(() => { + const content = this.content(); + if (content) { + return content; + } + const name = this.name(); + if (this.#iconSet && name) { + return this.#iconSet.getIcon(name); } - if (this.iconSet && this.name) { - return this.iconSet.getIcon(this.name); + if (name && !this.#iconSet?.icons[name]) { + console.warn( + `c-icon component: The '${name}' icon not found. Add it to the IconSet service for use with the 'name' property. \n`, + name + ); } - if (this.name && !this.iconSet?.icons[this.name]) - console.warn(`c-icon component: icon name '${this.name}' does not exist for IconSet service. ` + - `To use icon by 'name' prop you need to add it to IconSet service. \n`, - this.name - ); - return undefined; - } + return ''; + }); - get scale(): string { - return Array.isArray(this.code) && this.code.length > 1 ? `0 0 ${this.code[0]}` : '0 0 64 64'; - } + readonly scale = computed(() => { + return Array.isArray(this.code()) && (this.code()?.length ?? 0) > 1 ? `0 0 ${this.code()?.[0]}` : '0 0 64 64'; + }); - get computedSize(): Exclude | undefined { - const addCustom = !this.size && (this.width || this.height); - return this.size === 'custom' || addCustom ? 'custom-size' : this.size; - } + readonly computedSize = computed(() => { + const addCustom = !this.size() && (this.width() || this.height()); + return this.size() === 'custom' || addCustom ? 'custom-size' : this.size(); + }); - get computedClasses(): any { + readonly computedClasses = computed(() => { const classes = { icon: true, - [`icon-${this.computedSize}`]: !!this.computedSize + [`icon-${this.computedSize()}`]: !!this.computedSize() }; - return !!this.customClasses ? this.customClasses : classes; - } - - toCamelCase(str: string): any { - return str.replace(/([-_][a-z0-9])/ig, ($1: string) => { - return $1.toUpperCase().replace('-', ''); - }); - } + return this.customClasses() ?? classes; + }); } diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts b/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts index 9c9bfe6a..eaece6ec 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts @@ -1,57 +1,73 @@ -import { Component, DebugElement, Renderer2, Type, ViewChild } from '@angular/core'; +import { Component, DebugElement, ElementRef, ViewChild, inject } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { By, DomSanitizer } from '@angular/platform-browser'; +import { By } from '@angular/platform-browser'; import { IconDirective } from './icon.directive'; import { IconSetService } from '../icon-set'; import { cilList } from '@coreui/icons'; @Component({ - template: ` - ` + template: '', + imports: [IconDirective], + providers: [IconSetService] }) class TestComponent { - @ViewChild(IconDirective, {read: IconDirective}) iconRef!: IconDirective; + iconSet = inject(IconSetService); - constructor( - public iconSet: IconSetService - ) { - this.iconSet.icons = {cilList}; + constructor() { + this.iconSet.icons = { cilList }; } + + @ViewChild(IconDirective, { read: IconDirective }) public iconRef!: IconDirective; } +class MockElementRef extends ElementRef {} describe('IconDirective', () => { let component: TestComponent; let fixture: ComponentFixture; let svgEl: DebugElement; - let renderer: Renderer2; - let sanitizer: DomSanitizer; - let iconSetService: IconSetService; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [TestComponent, IconDirective], - providers: [IconSetService] + providers: [IconSetService, { provide: ElementRef, useClass: MockElementRef }], + imports: [IconDirective, TestComponent] }).compileComponents(); fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; fixture.detectChanges(); svgEl = fixture.debugElement.query(By.css('svg')); - renderer = fixture.componentRef.injector.get(Renderer2 as Type); - sanitizer = fixture.componentRef.injector.get(DomSanitizer); - iconSetService = fixture.componentRef.injector.get(IconSetService); }); - it('should create an instance', () => { - const directive = new IconDirective(renderer, svgEl, sanitizer, iconSetService); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new IconDirective(); + expect(directive).toBeTruthy(); + }); }); + + it('service should exist', () => { + expect(component.iconSet).toBeTruthy(); + }); + + it('icon component should render', () => { + expect(component.iconRef).toBeTruthy(); + expect(component.iconRef.code()).toBe(component.iconSet.icons['cilList']); + }); + it('icon classes should be applied', () => { expect(svgEl.nativeElement).toBeTruthy(); expect(svgEl.nativeElement).toHaveClass('icon'); expect(svgEl.nativeElement).toHaveClass('icon-lg'); expect(svgEl.nativeElement).toHaveClass('test'); }); + + it('icon attributes should be applied', () => { + expect(svgEl.nativeElement.getAttribute('aria-hidden')).toBe('true'); + expect(svgEl.nativeElement.getAttribute('pointer-events')).toBe('none'); + expect(svgEl.nativeElement.getAttribute('role')).toBe('img'); + expect(svgEl.nativeElement.getAttribute('title')).toBe('Test'); + expect(svgEl.nativeElement.getAttribute('viewBox')).toBeDefined(); + expect(svgEl.nativeElement.getAttribute('xmlns')).toBe('http://www.w3.org/2000/svg'); + }); }); diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts b/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts index c4725cc5..58ccdfd4 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts @@ -1,113 +1,89 @@ -import { Directive, ElementRef, HostBinding, Input, Renderer2 } from '@angular/core'; +import { computed, Directive, inject, input } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; -import { IconSetService } from '../icon-set'; -import { IconSize, IIcon } from './icon.interface'; +import { IconSetService } from '../icon-set'; +import { IconSize, IIcon, IPointerEvents, NgCssClass } from './icon.interface'; +import { transformName } from './icon.utils'; @Directive({ + exportAs: 'cIcon', selector: 'svg[cIcon]', - exportAs: 'cIcon' + host: { + '[innerHtml]': 'innerHtml()', + '[class]': 'hostClasses()', + '[attr.viewBox]': 'viewBox()', + '[attr.xmlns]': 'xmlns()', + '[attr.pointer-events]': 'pointerEvents()', + '[attr.role]': 'role()', + '[attr.aria-hidden]': 'true' + } }) export class IconDirective implements IIcon { - - @Input('cIcon') content?: string | string[] | any[]; - @Input() size: IconSize = ''; - @Input() title?: string; - @Input() customClasses?: string | string[] | Set | { [klass: string]: any }; - @Input() width?: string; - @Input() height?: string; - - @Input() - set name(name: string) { - this._name = name?.includes('-') ? this.toCamelCase(name) : name; - } - get name(): string { - return this._name; - } - private _name!: string; - - @HostBinding('attr.viewBox') - @Input() - set viewBox(viewBox: string) { - this._viewBox = viewBox; - } - get viewBox(): string { - return this._viewBox ?? this.scale; - } - private _viewBox!: string; - - @HostBinding('attr.xmlns') - @Input() xmlns = 'http://www.w3.org/2000/svg'; - - @HostBinding('attr.pointer-events') - @Input('pointer-events') pointerEvents = 'none'; - - @HostBinding('attr.role') - @Input() role = 'img'; - - @HostBinding('class') - get hostClasses() { + readonly #sanitizer = inject(DomSanitizer); + readonly #iconSet = inject(IconSetService); + + readonly content = input(undefined, { alias: 'cIcon' }); + + readonly customClasses = input(); + readonly size = input(''); + readonly title = input(); + readonly height = input(); + readonly width = input(); + readonly name = input('', { transform: transformName }); + readonly viewBoxInput = input(undefined, { alias: 'viewBox' }); + readonly xmlns = input('http://www.w3.org/2000/svg'); + readonly pointerEvents = input('none', { alias: 'pointer-events' }); + readonly role = input('img'); + + readonly hostClasses = computed(() => { + const computedSize = this.computedSize(); const classes = { icon: true, - [`icon-${this.computedSize}`]: !!this.computedSize + [`icon-${computedSize}`]: !!computedSize }; - return this.customClasses ?? classes; - } + return this.customClasses() ?? classes; + }); - @HostBinding('innerHtml') - get innerHtml() { - const code = Array.isArray(this.code) ? this.code[1] || this.code[0] : this.code ?? ''; + readonly viewBox = computed(() => { + return this.viewBoxInput() ?? this.scale(); + }); + + readonly innerHtml = computed(() => { + const codeVal = this.code(); + const code = Array.isArray(codeVal) ? (codeVal?.[1] ?? codeVal?.[0] ?? '') : codeVal || ''; // todo proper sanitize // const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, code); - return this.sanitizer.bypassSecurityTrustHtml((this.titleCode + code) ?? ''); - } + return this.#sanitizer.bypassSecurityTrustHtml(this.#titleCode() + code || ''); + }); - constructor( - private renderer: Renderer2, - private elementRef: ElementRef, - private sanitizer: DomSanitizer, - private iconSet: IconSetService - ) { } - - get titleCode(): string { - return this.title ? `${this.title}` : ''; - } + readonly #titleCode = computed(() => { + return this.title() ? `${this.title()}` : ''; + }); - get code(): string | string[] | undefined { - if (this.content) { - return this.content; + readonly code = computed(() => { + const content = this.content(); + if (content) { + return content; } - if (this.iconSet && this.name) { - return this.iconSet.getIcon(this.name); + const name = this.name(); + if (this.#iconSet && name) { + return this.#iconSet.getIcon(name); } - if (this.name && !this.iconSet?.icons[this.name]) - console.warn(`c-icon component: icon name '${this.name}' does not exist for IconSet service. ` + - `To use icon by 'name' prop you need to add it to IconSet service. \n`, - this.name + if (name && !this.#iconSet?.icons[name]) { + console.warn( + `cIcon directive: The '${name}' icon not found. Add it to the IconSet service for use with the 'name' property. \n`, + name ); - return undefined; - } - - get scale(): string { - return Array.isArray(this.code) && this.code.length > 1 ? `0 0 ${this.code[0]}` : '0 0 64 64'; - } - - get computedSize(): Exclude | undefined { - const addCustom = !this.size && (this.width || this.height); - return this.size === 'custom' || addCustom ? 'custom-size' : this.size; - } + } + return ''; + }); - get computedClasses(): any { - const classes = { - icon: true, - [`icon-${this.computedSize}`]: !!this.computedSize - }; - return !!this.customClasses ? this.customClasses : classes; - } + readonly scale = computed(() => { + return Array.isArray(this.code()) && (this.code()?.length ?? 0) > 1 ? `0 0 ${this.code()?.[0]}` : '0 0 64 64'; + }); - toCamelCase(str: string): any { - return str.replace(/([-_][a-z0-9])/ig, ($1: string) => { - return $1.toUpperCase().replace('-', ''); - }); - } + readonly computedSize = computed(() => { + const addCustom = !this.size() && (this.width() || this.height()); + return this.size() === 'custom' || addCustom ? 'custom-size' : this.size(); + }); } diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.interface.ts b/projects/coreui-icons-angular/src/lib/icon/icon.interface.ts index 48ce8c57..379cf0ba 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.interface.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.interface.ts @@ -1,18 +1,20 @@ +import { InputSignal, InputSignalWithTransform } from '@angular/core'; + export interface IIcon { - content?: string | string[] | any[]; - customClasses?: string | string[] | Set | { [klass: string]: any }; - height?: string; - name?: string; - pointerEvents?: string; - size?: IconSize; - title?: string; - viewBox?: string; - width?: string; - xmlns?: string; + content?: InputSignal; + customClasses?: InputSignal; + height?: InputSignal; + name?: InputSignalWithTransform; + pointerEvents?: InputSignal; + size?: InputSignal; + title?: InputSignal; + viewBoxInput?: InputSignal; + width: InputSignal; + xmlns?: InputSignal; } export type IconSize = - 'custom' + | 'custom' | 'custom-size' | 'sm' | 'lg' @@ -26,3 +28,18 @@ export type IconSize = | '8xl' | '9xl' | string; + +export type IPointerEvents = + | 'auto' + | 'bounding-box' + | 'visiblePainted' + | 'visibleFill' + | 'visibleStroke' + | 'visible' + | 'painted' + | 'fill' + | 'stroke' + | 'all' + | 'none'; + +export type NgCssClass = string | string[] | Set | { [klass: string]: any }; diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.module.ts b/projects/coreui-icons-angular/src/lib/icon/icon.module.ts index ac606b38..3cf95951 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.module.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.module.ts @@ -1,23 +1,15 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - import { IconComponent } from './icon.component'; import { IconDirective } from './icon.directive'; -import { HtmlAttributesDirective } from '../shared/html-attr.directive'; @NgModule({ - declarations: [ + imports: [ IconComponent, - HtmlAttributesDirective, IconDirective ], - imports: [ - CommonModule, - ], exports: [ IconComponent, IconDirective - ], + ] }) -export class IconModule { -} +export class IconModule {} diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.utils.ts b/projects/coreui-icons-angular/src/lib/icon/icon.utils.ts new file mode 100644 index 00000000..76add244 --- /dev/null +++ b/projects/coreui-icons-angular/src/lib/icon/icon.utils.ts @@ -0,0 +1,9 @@ +export function toCamelCase(value: string) { + return value.replace(/([-_][a-z0-9])/ig, ($1: string) => { + return $1.toUpperCase().replace('-', ''); + }); +} + +export function transformName(value: string) { + return value && value.includes('-') ? toCamelCase(value) : value; +} diff --git a/projects/coreui-icons-angular/src/lib/icon/public_api.ts b/projects/coreui-icons-angular/src/lib/icon/public_api.ts index d5ea9757..3db96a1f 100644 --- a/projects/coreui-icons-angular/src/lib/icon/public_api.ts +++ b/projects/coreui-icons-angular/src/lib/icon/public_api.ts @@ -1,5 +1,6 @@ export { IconDirective } from './icon.directive'; export { IconComponent } from './icon.component'; export { IconModule } from './icon.module'; +export { toCamelCase } from './icon.utils'; diff --git a/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.spec.ts b/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.spec.ts index 9a82f25e..5ba9ca78 100644 --- a/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.spec.ts +++ b/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.spec.ts @@ -1,53 +1,50 @@ -import { Component, DebugElement, Renderer2, Type } from '@angular/core'; +import { Component, DebugElement, ElementRef, Renderer2 } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { HtmlAttributesDirective } from './html-attr.directive'; @Component({ - template: ` -
      ` + template: `
      `, + imports: [HtmlAttributesDirective] }) -class TestComponent { -} +class TestComponent {} -describe('HtmlAttributesDirective', () => { +class MockElementRef extends ElementRef {} - let component: TestComponent; +describe('HtmlAttributesDirective', () => { let fixture: ComponentFixture; - let inputEl: DebugElement; - let renderer: Renderer2; + let debugElement: DebugElement; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [TestComponent, HtmlAttributesDirective] + imports: [HtmlAttributesDirective, TestComponent], + providers: [Renderer2, { provide: ElementRef, useClass: MockElementRef }] }); fixture = TestBed.createComponent(TestComponent); - component = fixture.componentInstance; - inputEl = fixture.debugElement.query(By.css('div')); - renderer = fixture.componentRef.injector.get(Renderer2 as Type); + debugElement = fixture.debugElement.query(By.css('div')); }); it('should create an instance', () => { - const directive = new HtmlAttributesDirective(renderer, inputEl); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new HtmlAttributesDirective(); + expect(directive).toBeTruthy(); + }); }); it('should render a class attr', () => { fixture.detectChanges(); - // console.log(inputEl.nativeElement.classList); - expect(inputEl.nativeElement.classList.contains('test')).toBeTruthy(); + expect(debugElement.nativeElement).toHaveClass('test'); }); it('should render a style attr', () => { fixture.detectChanges(); // console.log(inputEl.nativeElement.style.backgroundColor); - expect(inputEl.nativeElement.style.backgroundColor).toBe('red'); + expect(debugElement.nativeElement.style.backgroundColor).toBe('red'); }); it('should render an id attr', () => { fixture.detectChanges(); - // console.log(inputEl.nativeElement.attributes); - expect(inputEl.nativeElement.getAttribute('id')).toBe('id-1'); + expect(debugElement.nativeElement.getAttribute('id')).toBe('id-1'); }); }); diff --git a/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.ts b/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.ts index 9ad1694f..b5b9dfb6 100644 --- a/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.ts +++ b/projects/coreui-icons-angular/src/lib/shared/html-attr.directive.ts @@ -1,22 +1,19 @@ -import { Directive, ElementRef, Input, OnInit, Renderer2 } from '@angular/core'; +import { Directive, effect, ElementRef, inject, input, Renderer2 } from '@angular/core'; @Directive({ selector: '[cHtmlAttr]', exportAs: 'cHtmlAttr' }) -export class HtmlAttributesDirective implements OnInit { +export class HtmlAttributesDirective { + readonly cHtmlAttr = input>(); - @Input() cHtmlAttr?: { [key: string]: any }; + readonly #renderer = inject(Renderer2); + readonly #elementRef = inject(ElementRef); - constructor( - private renderer: Renderer2, - private el: ElementRef - ) {} - - ngOnInit(): void { - const attribs = this.cHtmlAttr; + readonly attrEffect = effect(() => { + const attribs = this.cHtmlAttr(); for (const attr in attribs) { - if (attr === 'style' && typeof (attribs[attr]) === 'object') { + if (attr === 'style' && typeof attribs[attr] === 'object') { this.setStyle(attribs[attr]); } else if (attr === 'class') { this.addClass(attribs[attr]); @@ -24,25 +21,28 @@ export class HtmlAttributesDirective implements OnInit { this.setAttrib(attr, attribs[attr]); } } - } + }); - private setStyle(styles: any): void { - // tslint:disable-next-line:forin + private setStyle(styles: Record): void { for (const style in styles) { - this.renderer.setStyle(this.el.nativeElement, style, styles[style]); + if (style) { + this.#renderer.setStyle(this.#elementRef.nativeElement, style, styles[style]); + } } } private addClass(classes: string | string[]): void { - const classArray = (Array.isArray(classes) ? classes : classes.split(' ')); - classArray.filter((element) => element.length > 0).forEach(element => { - this.renderer.addClass(this.el.nativeElement, element); - }); + const classArray = Array.isArray(classes) ? classes : classes.split(' '); + classArray + .filter((element) => element.length > 0) + .forEach((element) => { + this.#renderer.addClass(this.#elementRef.nativeElement, element); + }); } private setAttrib(key: string, value: string | null): void { - value !== null ? - this.renderer.setAttribute(this.el.nativeElement, key, value) : - this.renderer.removeAttribute(this.el.nativeElement, key); + value !== null + ? this.#renderer.setAttribute(this.#elementRef.nativeElement, key, value) + : this.#renderer.removeAttribute(this.#elementRef.nativeElement, key); } } diff --git a/projects/coreui-icons-angular/src/public-api.ts b/projects/coreui-icons-angular/src/public-api.ts index e5b4cbfa..cd197290 100644 --- a/projects/coreui-icons-angular/src/public-api.ts +++ b/projects/coreui-icons-angular/src/public-api.ts @@ -4,5 +4,5 @@ export { IconDirective } from './lib/icon/icon.directive'; export { IconComponent } from './lib/icon/icon.component'; export { IconModule } from './lib/icon/icon.module'; -export { IconSetService, IIconSet } from './lib/icon-set/icon-set.service'; +export { IconSetService, type IIconSet } from './lib/icon-set/icon-set.service'; export { IconSetModule } from './lib/icon-set/icon-set.module'; diff --git a/projects/coreui-icons-angular/src/test.ts b/projects/coreui-icons-angular/src/test.ts index 9e58f8ca..f17fa2d1 100644 --- a/projects/coreui-icons-angular/src/test.ts +++ b/projects/coreui-icons-angular/src/test.ts @@ -8,21 +8,9 @@ import { platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; -declare const require: { - context(path: string, deep?: boolean, filter?: RegExp): { - (id: string): T; - keys(): string[]; - }; -}; - // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { teardown: { destroyAfterEach: true }}, ); - -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().forEach(context); diff --git a/projects/coreui-icons-angular/tsconfig.json b/projects/coreui-icons-angular/tsconfig.json index b3e0d01a..7c7247fa 100644 --- a/projects/coreui-icons-angular/tsconfig.json +++ b/projects/coreui-icons-angular/tsconfig.json @@ -1,4 +1,5 @@ { + "extends": "../../tsconfig.json", "files": [], "references": [ { diff --git a/projects/coreui-icons-angular/tsconfig.lib.prod.json b/projects/coreui-icons-angular/tsconfig.lib.prod.json index 06de549e..599e1bdf 100644 --- a/projects/coreui-icons-angular/tsconfig.lib.prod.json +++ b/projects/coreui-icons-angular/tsconfig.lib.prod.json @@ -2,9 +2,13 @@ { "extends": "./tsconfig.lib.json", "compilerOptions": { - "declarationMap": false + "declarationMap": false, }, "angularCompilerOptions": { "compilationMode": "partial" - } + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts" + ] } diff --git a/projects/coreui-icons-angular/tsconfig.schematics.json b/projects/coreui-icons-angular/tsconfig.schematics.json new file mode 100644 index 00000000..13131e4f --- /dev/null +++ b/projects/coreui-icons-angular/tsconfig.schematics.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "lib": [ + "ES2022", + "dom" + ], + "declaration": true, + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "rootDir": "schematics", + "outDir": "../../dist/coreui-icons-angular/schematics", + "resolveJsonModule": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strictNullChecks": true, + "target": "ES2022", + "types": [ + "jasmine", + "node" + ] + }, + "include": [ + "schematics/**/*" + ], + "exclude": [ + "schematics/*/files/**/*" + ] +} diff --git a/projects/coreui-icons-angular/tsconfig.spec.json b/projects/coreui-icons-angular/tsconfig.spec.json index 715dd0a5..65020c8b 100644 --- a/projects/coreui-icons-angular/tsconfig.spec.json +++ b/projects/coreui-icons-angular/tsconfig.spec.json @@ -12,6 +12,7 @@ ], "include": [ "**/*.spec.ts", - "**/*.d.ts" + "**/*.d.ts", + "**/*.ts" ] } diff --git a/tsconfig.json b/tsconfig.json index 82560c05..5bebe447 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,22 +18,25 @@ "forceConsistentCasingInFileNames": true, "strict": true, "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": false, + "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "esModuleInterop": true, "sourceMap": true, "declaration": false, - "downlevelIteration": true, "experimentalDecorators": true, - "moduleResolution": "node", + "moduleResolution": "bundler", + "resolveJsonModule": true, "importHelpers": true, - "target": "es2020", - "module": "es2020", + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, "typeRoots": [ "node_modules/@types" ], "lib": [ - "es2020", + "ES2022", "dom" ] },